Te whakahoki i tetahi uara mai i te tono-tono powershell ki te kaihoko SQL Server

I te wa e hanga ana i taku ake tikanga mo te whakahaere i nga taapiri i runga i te maha o nga tūmau MS-SQL, he nui taku wa ki te ako i te tikanga mo te tuku uara i roto i te Powershell i nga wa waea mamao, no reira kei te tuhi au i tetahi whakamaumaharatanga ki a au ano kei te whai hua. ki tetahi atu.

Na, me timata me te tuhi ngawari me te whakahaere i te rohe:

$exitcode = $args[0]
Write-Host 'Out to host.'
Write-Output 'Out to output.'
Write-Host ('ExitCode: ' + $exitcode)
Write-Output $exitcode
$host.SetShouldExit($exitcode)

Hei whakahaere i nga tuhinga, ka whakamahia e au te konae CMD e whai ake nei, kaore au e whakauru i nga wa katoa:

@Echo OFF
PowerShell .TestOutput1.ps1 1
ECHO ERRORLEVEL=%ERRORLEVEL%

I runga i te mata ka kite tatou i nga mea e whai ake nei:

Out to host.
Out to output.
ExitCode: 1
1
ERRORLEVEL=1


Inaianei me whakahaere taua tuhinga ma WSMAN (mamao):

Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]

A koinei te hua:

Out to host.
Out to output.
ExitCode: 2
2
ERRORLEVEL=0

He rawe, kua ngaro te Errorlevel ki tetahi waahi, engari me tiki e tatou te uara mai i te tuhinga! Kia tamata tatou i te hoahoa e whai ake nei:

$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]

He pai ake tenei. Kua ngaro te karere i roto i te Putanga ki tetahi waahi:

Out to host.
ExitCode: 2
ERRORLEVEL=0

Inaianei, hei rerenga korero, ka kite ahau mena kei roto i te mahi Powershell ka tuhi koe i te Tuhi-Putanga, he korero noa ranei me te kore e tautapa ki tetahi taurangi (me tenei e whakaatu ana he putanga ki te hongere Putanga), katahi ano ka rere ki te rohe, kaore he mea e whakaatuhia ki te mata! He hua tenei na te hangahanga paipa powershell - kei ia mahi tana ake paipa Putanga, ka hangaia he huinga mo taua mea, a ko nga mea katoa ka uru ki roto ka kiia ko te hua o te mahi mahi, ka taapirihia e te Kaiwhakahaere Whakahoki te uara whakahoki ki taua mea. pipeline hei huānga whakamutunga me te whakawhiti mana ki te mahi karanga. Hei whakaatu, me whakahaere te tuhinga e whai ake nei ki te rohe:

Function Write-Log {
  Param( [Parameter(Mandatory=$false, ValueFromPipeline=$true)] [String[]] $OutString = "`r`n" )
  Write-Output ("Function: "+$OutString)
  Return "ReturnValue"
}
Write-Output ("Main: "+"ParameterValue")
$res = Write-Log "ParameterValue"
$res.GetType()
$res.Length
$res | Foreach-Object { Write-Host ("Main: "+$_) }

A koinei te hua:

Main: ParameterValue

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
2
Main: Function: ParameterValue
Main: ReturnValue

Ko te mahi matua (tinana tuhinga) kei a ia ano te paipa Huaputa, a ki te whakahaeretia e tatou te tuhinga tuatahi mai i te CMD, ka tukuna ano te putanga ki tetahi konae,

PowerShell .TestOutput1.ps1 1 > TestOutput1.txt

katahi ka kite tatou i runga i te mata

ERRORLEVEL=1

me te konae

Out to host.
Out to output.
ExitCode: 1
1

ki te hanga tatou i te waea rite i powershell

PS D:sqlagent> .TestOutput1.ps1 1 > TestOutput1.txt

katahi ka waiho ki te mata

Out to host.
ExitCode: 1

me te konae

Out to output.
1

Ka puta tenei na te mea ka whakarewahia e te CMD te powershell, na te kore o etahi atu tohutohu, ka whakakotahi i nga miro e rua (Kaihautu me te Putanga) ka hoatu ki te CMD, ka tukuna nga mea katoa i whakawhiwhia ki tetahi konae, a, mo te whakarewatanga mai i te Powershell, Ko enei miro e rua kei te noho wehe, a ko te hurihanga tohu ka pa ki te Putanga anake.

Ka hoki ki te kaupapa matua, kia mahara tatou ko te tauira ahanoa .NET kei roto Powershell kei roto i te rorohiko kotahi (kotahi OS), i te wa e rere mamao ana te waehere ma te WSMAN, ka puta te whakawhitinga o nga taonga ma te raupapatanga XML, ka nui ake te hiahia. ki ta maatau rangahau. Me haere tonu a maatau whakamatautau ma te whakahaere i te waehere e whai ake nei:

$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
$res.GetType()
$host.SetShouldExit($res)

A koinei te mea kei runga i te mata:

Out to host.

ExitCode: 3

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
Не удается преобразовать аргумент "exitCode", со значением: "System.Object[]", для "SetShouldExit" в тип "System.Int32": "Не удается преобразовать значение "System.Object[]" типа "System.Object[]" в тип "System
.Int32"."
D:sqlagentTestOutput3.ps1:3 знак:1
+ $host.SetShouldExit($res)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

ERRORLEVEL=0

Hua pai! Ko te tikanga ka karangahia te Invoke-Command, ka mau tonu te wehenga o nga paipa ki roto i nga miro e rua (Kaihautu me te Putanga), e tumanako ai tatou mo te angitu. Me ngana ki te waiho kia kotahi anake te uara ki roto i te awa Huaputa, ma reira ka huri tatou i te tuhinga tuatahi ka rere mamao tatou:

$exitcode = $args[0]
Write-Host 'Out to host.'
#Write-Output 'Out to output.'
Write-Host ('ExitCode: ' + $exitcode)
Write-Output $exitcode
$host.SetShouldExit($exitcode)

Kia penei ta tatou whakahaere:

$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
$host.SetShouldExit($res)

ā... ĀE, he toa te āhua!

Out to host.
ExitCode: 4

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType


ERRORLEVEL=4

Kia tamata tatou ki te mohio he aha te mea i tupu. I waea atu matou ki a Powershell i te rohe, ka kiia ko te powershell i runga i te rorohiko mamao, ka mahia ta matou tuhinga ki reira. E rua nga awa (Kaihautu me te Putanga) mai i te miihini mamao i raupapahia, ka hoki whakamuri, ko te awa Huaputa, he uara mamati kotahi kei roto, ka hurihia ki te momo Int32 ka tukuna ki te taha tango, ka whakamahia e te taha tango. hei waehere putanga o te anga hiko kaiwaea.

Hei tirotiro whakamutunga, me hanga he mahi kotahi-taahiraa i runga i te tūmau SQL me te momo "Punaha whakahaere (cmdexec)" me nga tuhinga e whai ake nei:

PowerShell -NonInteractive -NoProfile "$res=Invoke-Command -ComputerName BACKUPSERVER -ConfigurationName SQLAgent -ScriptBlock {&'D:sqlagentTestOutput1.ps1' 6}; $host.SetShouldExit($res)"

HOORAY! Kua oti te mahi he hapa, he kuputuhi kei roto i te rangitaki:

Выполняется от имени пользователя: DOMAINagentuser. Out to host. ExitCode: 6.  Код завершения процесса 6.  Шаг завершился с ошибкой.

Whakamutunga:

  • A ape i te whakamahi i te Tuhituhi-Putanga me te whakaatu i nga korero kaore he taumahi. Kia mohio ko te neke i tenei waehere ki etahi atu waahi o te tuhinga ka puta he hua ohorere.
  • I roto i nga tuhinga kaore mo te whakarewatanga a-ringa, engari mo te whakamahi i roto i o miihini aunoa, ina koa mo nga waea mamao ma te WINRM, mahia te whakahaere hapa a-ringa ma te Whakamātau/Hopu, me te whakarite, i roto i nga whanaketanga o nga huihuinga, ka tukuna e tenei tuhinga tetahi uara momo taketake. . Ki te hiahia koe ki te tiki i te Errorlevel matarohia, me tau tenei uara.

Source: will.com

Tāpiri i te kōrero