Kudzosa kukosha kubva kupowershell invoke-command kune SQL Server mumiririri

Kana ndichigadzira yangu nzira yekugadzirisa ma backups pane akawanda MS-SQL maseva, ndakapedza nguva yakawanda ndichidzidza magadzirirwo ekupfuura kukosha muPowershell panguva dzekufona dziri kure, saka ndiri kunyora chiyeuchidzo kwandiri kana zvichibatsira. kune mumwe munhu.

Saka, ngatitange ne script iri nyore uye tiimhanye munharaunda:

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

Kumhanyisa zvinyorwa, ini ndichashandisa inotevera CMD faira, ini handisi kuzoisanganisira nguva dzese:

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

Pa-screen tinoona zvinotevera:

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


Zvino ngatimhanyei script imwechete kuburikidza neWSMAN (kure):

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

Uye heino mhedzisiro:

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

Hukuru, Errorlevel yanyangarika kumwe kunhu, asi isu tinofanirwa kuwana kukosha kubva kune script! Ngatiedzei dhizaini inotevera:

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

Izvi zvakatonyanya kunakidza. Meseji iri muOutput yanyangarika kumwe kunhu:

Out to host.
ExitCode: 2
ERRORLEVEL=0

Ikozvino, sekurira kwerwiyo, ini ndichaona kuti kana mukati mePowershell basa iwe ukanyora Nyora-Output kana kungotaura pasina kuigovera kune chero shanduko (uye izvi zvinonyatsoreva zvinobuda kune Output chiteshi), ipapo kunyangwe kana uchimhanya munharaunda, hapana chicharatidzwa pachiratidziri! Izvi ndizvo mhedzisiro yepowershell pombi yekuvaka - imwe neimwe basa ine yayo Output pombi, array inogadzirirwa iyo, uye zvese zvinopinda mairi zvinoonekwa semhedzisiro yebasa rekuita, Return opareta anowedzera kukosha kwekudzoka kune imwecheteyo. pombi sechinhu chekupedzisira uye inotamisa kutonga kune yekufona basa. Kuenzanisira, ngatimhanyei script inotevera munharaunda:

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

Uye heino mhedzisiro:

Main: ParameterValue

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

Basa guru (script body) rinewo pombi yaro yeOutput, uye kana tikamhanya script yekutanga kubva kuCMD, tichiendesa zvakabuda kufaira,

PowerShell .TestOutput1.ps1 1 > TestOutput1.txt

ipapo tichaona pachiratidziro

ERRORLEVEL=1

uye mufaira

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

kana tikaita runhare rwakafanana kubva kupowershell

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

ipapo ichava pahwindo

Out to host.
ExitCode: 1

uye mufaira

Out to output.
1

Izvi zvinoitika nekuti CMD inotanga powershell, iyo, pasina mimwe mirairo, inosanganisa tambo mbiri (Host uye Output) uye inovapa kuCMD, iyo inotumira zvese zvayakagamuchira kufaira, uye kana iri yekumhanya kubva kune powershell, shinda mbiri idzi dziripo zvakaparadzana, uye chiratidzo chinodzokorodza chinobata chete Kubuda.

Kudzokera kumusoro wenyaya, ngatirangarirei kuti .NET chinhu modhi mukati mepowershell iripo zvizere mukati mekombuta imwe (imwe OS), kana uchimhanyisa kodhi uri kure kuburikidza neWSMAN, kutamiswa kwezvinhu kunoitika kuburikidza neXML serialization, izvo zvinounza zvakawanda zvekuwedzera kufarira. kutsvagurudzo yedu. Ngatienderere mberi nemiedzo yedu nekushandisa kodhi inotevera:

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

Uye izvi ndizvo zvatinazvo pachiratidziri:

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

Chigumisiro chikuru! Zvinoreva kuti kana uchidaidza Invoke-Command, kupatsanurwa kwepombi kuita tambo mbiri (Host uye Output) kunochengetwa, izvo zvinotipa tariro yekubudirira. Ngatiedzei kusiya kukosha kumwe chete muOutput stream, yatinozoshandura iyo yekutanga script yatinomhanyisa kure:

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

Ngatimhanye seizvi:

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

uye ... HERE, zvinoratidzika sekukunda!

Out to host.
ExitCode: 4

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


ERRORLEVEL=4

Ngatiedzei kufunga kuti chii chakaitika. Isu takadaidza Powershell munharaunda, iyo yakazodaidzawo powershell pakombuta iri kure uye tikaita script yedu ipapo. Hova mbiri (Host and Output) kubva kumuchina uri kure akaiswa serial uye akadzoserwa kumashure, nepo Output rwizi, iine imwechete yedhijitari kukosha mairi, yakashandurwa kuita type Int32 uye nekudaro yakapfuudzwa kudivi rekugamuchira, uye divi rekugamuchira rakaishandisa. sekodhi yekubuda yeanofona powershell.

Uye secheki yekupedzisira, ngatigadzire basa-danho rimwe paSQL server nemhando "Operating system (cmdexec)" ine chinyorwa chinotevera:

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

HOORAY! Basa rakapedzwa nekanganiso, mavara mulogi:

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

Mhedziso:

  • Dzivisa kushandisa Nyora-Output uye kutsanangura mataurirwo pasina basa. Ziva kuti kufambisa kodhi iyi kumwe kunhu mune script kunogona kuburitsa zvisingatarisirwe.
  • Mune zvinyorwa zvakagadzirirwa kwete zvekutanga zvemanyorero, asi zvekushandisa mumagetsi ako otomatiki, kunyanya kufona kure kuburikidza neWINRM, ita zvikanganiso zvemanyorero kuburikidza neTry/Catch, uye ive nechokwadi chekuti, mune chero budiriro yezviitiko, script iyi inotumira chaiyo imwe yekutanga mhando kukosha. . Kana iwe uchida kuwana yekare Errorlevel, kukosha uku kunofanirwa kuve kwenhamba.

Source: www.habr.com

Voeg