Ukubuyisela ixabiso ukusuka kwi-invoke-command ye-powershell ukuya kwi-arhente yomncedisi we-SQL

Xa ndisenza eyam indlela yokulawula ii-backups kwiiseva ezininzi ze-MS-SQL, ndichithe ixesha elininzi ndifunda indlela yokudlula amaxabiso kwi-Powershell ngexesha lokufowuna okude, ngoko ke ndibhalela isikhumbuzi kum ukuba sinokuba luncedo. komnye umntu.

Ke, masiqale ngeskripthi esilula kwaye siyiqhube ekuhlaleni:

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

Ukuqhuba izikripthi, ndiza kusebenzisa le fayile ilandelayo yeCMD, andizukuyibandakanya ngalo lonke ixesha:

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

Kwisikrini siza kubona oku kulandelayo:

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


Ngoku masiqhube iskripthi esifanayo nge-WSMAN (ukude):

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

Kwaye nantsi isiphumo:

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

Mkhulu, i-Errorlevel ilahlekile kwenye indawo, kodwa kufuneka sifumane ixabiso kwiscript! Masizame uyilo lulandelayo:

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

Oku kunomdla ngakumbi. Umyalezo okwiSiphumo unyamalele kwenye indawo:

Out to host.
ExitCode: 2
ERRORLEVEL=0

Ngoku, njengophambuko lweengoma, ndiza kuqaphela ukuba ngaphakathi kwe-Powershell umsebenzi ubhala Bhala-Isiphumo okanye intetho nje ngaphandle kokuyabela kuyo nayiphi na into eguquguqukayo (kwaye oku kuthetha ngokuphandle isiphumo kwisikhululo seSiphumo), ngoko naxa usebenza ekuhlaleni, akukho nto iya kuboniswa kwiscreen! Esi sisiphumo soyilo lwemibhobho ye-powershell - umsebenzi ngamnye unombhobho weSiphumo, uluhlu lwenzelwe wona, kwaye yonke into engena kuyo ithathwa njengesiphumo sokwenziwa komsebenzi, umsebenzi woBuyiselo wongeza ixabiso lokubuyisela ngokufanayo. umbhobho njengento yokugqibela kunye nokudluliselwa kolawulo kumsebenzi wokufowuna. Ukubonisa, masiqhube iskripthi esilandelayo ekuhlaleni:

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: "+$_) }

Kwaye nantsi isiphumo:

Main: ParameterValue

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

Umsebenzi ophambili (umzimba wescript) nawo unombhobho weSiphumo, kwaye ukuba siqhuba iskripthi sokuqala esivela kwiCMD, sihambisa imveliso kwifayile,

PowerShell .TestOutput1.ps1 1 > TestOutput1.txt

emva koko siza kubona kwiscreen

ERRORLEVEL=1

nakwifayile

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

ukuba senza umnxeba ofanayo kwi-powershell

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

emva koko iya kuba kwiscreen

Out to host.
ExitCode: 1

nakwifayile

Out to output.
1

Oku kwenzeka ngenxa yokuba i-CMD iqalisa i-powershell, ethi, ngokungabikho kweminye imiyalelo, ixube imicu emibini (i-Host kunye ne-Output) kwaye inike i-CMD, ethumela yonke into efunyenweyo kwifayile, kwaye kwimeko yokuqaliswa kwi-powershell, le misonto mibini ikhona ngokwahlukeneyo, kwaye isimboli ukuqondisa kwakhona kuchaphazela kuphela Isiphumo.

Ukubuyela kwisihloko esiphambili, masikhumbule ukuba i-.NET imodeli yento ngaphakathi kwe-powershell ikhona ngokupheleleyo ngaphakathi kwekhompyutha enye (i-OS enye), xa usebenzisa ikhowudi ukude nge-WSMAN, ugqithiso lwezinto lwenzeka ngokulandelelana kwe-XML, ezisa umdla omninzi owongezelelweyo. kuphando lwethu. Masiqhubeke nemifuniselo yethu ngokusebenzisa le khowudi ilandelayo:

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

Kwaye yile nto sinayo kwiscreen:

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

Isiphumo esihle! Kuthetha ukuba xa ufowunela i-Invoke-Command, ulwahlulo lwemibhobho ibe yimisonto emibini (i-Host and Output) iyagcinwa, nto leyo esinika ithemba lempumelelo. Masizame ukushiya ixabiso elinye kuphela kuMjelo weZiphumo, apho siya kutshintsha esona sikripthi sokuqala esisiqhuba ukude:

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

Masiyiqhube ngolu hlobo:

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

kwaye ... EWE, kubonakala ngathi uloyiso!

Out to host.
ExitCode: 4

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


ERRORLEVEL=4

Makhe sizame ukuqonda ukuba kwenzeka ntoni. Safowunela i-powershell ekuhlaleni, eyathi yona yabiza i-powershell kwikhompyuter ekude kwaye senza iskripthi sethu apho. Imijelo emibini (i-Host kunye ne-Output) esuka kumatshini ekude yahlaziywa kwaye yagqithiswa emva, ngelixa i-Output stream, enexabiso elinye ledijithali kuyo, yaguqulelwa kuhlobo lwe-Int32 kwaye ngaloo ndlela yagqithiselwa kwicala lokufumana, kwaye icala elifumanayo liyisebenzisile. njengekhowudi yokuphuma yomnxeba we-powershell.

Kwaye njengetshekhi yokugqibela, masenze inyathelo elinye lomsebenzi kwiseva yeSQL ngohlobo “Inkqubo esebenzayo (cmdexec)” ngombhalo olandelayo:

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

HOORAY! Umsebenzi ugqitywe ngempazamo, okubhaliweyo kwilog:

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

Izigqibo:

  • Kuphephe ukusebenzisa i-Bhala-Isiphumo kunye nokuchaza amabinzana ngaphandle kwesabelo. Qaphela ukuba ukususa le khowudi kwenye indawo kwiscript kunokuvelisa iziphumo ezingalindelekanga.
  • Kwimibhalo ejoliswe kungekuko ukusungulwa ngesandla, kodwa kusetyenziso kwiindlela zakho ezizenzekelayo, ngakumbi kwiifowuni ezikude nge-WINRM, yenza impazamo ngesandla usebenzisa i-Try/Catch, kwaye uqinisekise ukuba, kulo naluphi na uphuhliso lweziganeko, esi script sithumela ngqo uhlobo olunye lwamandulo. . Ukuba ufuna ukufumana iErrorlevel yakudala, eli xabiso kufuneka libe linani.

umthombo: www.habr.com

Yongeza izimvo