Kubweza mtengo kuchokera ku powershell invoke-command kupita ku SQL Server agent

Popanga njira yanga yoyendetsera zosunga zobwezeretsera pa ma seva angapo a MS-SQL, ndidakhala nthawi yayitali ndikuwerenga njira yodutsira zinthu mu Powershell pamayitanidwe akutali, kotero ndikulemba chikumbutso kwa ine ngati zingakhale zothandiza. kwa wina.

Chifukwa chake, tiyeni tiyambe ndi script yosavuta ndikuyiyendetsa kwanuko:

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

Kuti ndigwiritse ntchito zolembedwa, ndigwiritsa ntchito fayilo ya CMD yotsatirayi, sindidzaiphatikiza nthawi zonse:

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

Pa skrini tiwona zotsatirazi:

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


Tsopano tiyeni tiyendetse zolemba zomwezo kudzera pa WSMAN (kutali):

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

Ndipo zotsatira zake ndi izi:

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

Chabwino, Errorlevel yasowa kwinakwake, koma tifunika kupeza phindu kuchokera pa script! Tiyeni tiyese zomanga zotsatirazi:

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

Izi ndizosangalatsa kwambiri. Uthenga womwe uli mu Output wasowa penapake:

Out to host.
ExitCode: 2
ERRORLEVEL=0

Tsopano, ngati kudodometsa kwanyimbo, ndiwona kuti ngati mkati mwa Powershell mumalemba Lembani-Output kapena mawu osapereka kusinthika kulikonse (ndipo izi zikutanthauza kutulutsa kwa Output channel), ndiye ngakhale mukuyenda kwanuko, palibe chomwe chidzawonetsedwa pazenera! Izi ndi zotsatira za kamangidwe ka mapaipi a powershell - ntchito iliyonse imakhala ndi payipi yakeyake yotulutsa, gulu limapangidwira, ndipo chilichonse chomwe chimalowamo chimatengedwa ngati zotsatira za ntchitoyo, wogwiritsa ntchito Return amawonjezera mtengo wobwereza womwewo. pipeline ngati chinthu chomaliza ndikusamutsira chiwongolero ku ntchito yoyitana. Kuti tiwonetse, tiyeni tiyendetse zolemba zotsatirazi kwanuko:

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

Ndipo zotsatira zake ndi izi:

Main: ParameterValue

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

Ntchito yayikulu (script body) ilinso ndi payipi yakeyake yotulutsa, ndipo ngati tiyendetsa script yoyamba kuchokera ku CMD, ndikulozera zomwe zatuluka ku fayilo,

PowerShell .TestOutput1.ps1 1 > TestOutput1.txt

ndiye tiwona pazenera

ERRORLEVEL=1

ndi mu file

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

ngati tiyimbanso foni yofanana ndi powershell

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

ndiye izo zidzakhala pa chophimba

Out to host.
ExitCode: 1

ndi mu file

Out to output.
1

Izi zimachitika chifukwa CMD imayambitsa powershell, yomwe, popanda malangizo ena, imasakaniza ulusi awiri (Host ndi Output) ndikuupereka kwa CMD, yomwe imatumiza zonse zomwe zalandira ku fayilo, komanso poyambitsa kuchokera ku powershell, ulusi awiriwa alipo mosiyana, ndipo chizindikiro cholozeranso chimangokhudza Kutulutsa.

Kubwerera ku mutu waukulu, tiyeni tikumbukire kuti .NET chinthu chitsanzo mkati powershell alipo mokwanira mkati kompyuta imodzi (Os imodzi), pamene kuthamanga kachidindo patali kudzera WSMAN, kusamutsa zinthu kumachitika kudzera XML serialization, amene amabweretsa zambiri chidwi zina. ku kafukufuku wathu. Tiyeni tipitilize zoyeserera zathu pogwiritsa ntchito nambala iyi:

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

Ndipo izi ndi zomwe tili nazo pazenera:

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

Zotsatira zabwino! Zikutanthauza kuti poyimba Invoke-Command, kugawanika kwa mapaipi kukhala ulusi awiri (Host ndi Output) kumasungidwa, zomwe zimatipatsa chiyembekezo chakuchita bwino. Tiyeni tiyese kusiya mtengo umodzi wokha mumtsinje wa Output, womwe tidzasintha mawu oyamba omwe timayendetsa patali:

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

Tiyeni tiyendetse motere:

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

ndi ... INDE, zikuwoneka ngati chigonjetso!

Out to host.
ExitCode: 4

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


ERRORLEVEL=4

Tiye tione zimene zinachitika. Tidayitana powershell kwanuko, yomwe idayitcha powershell pakompyuta yakutali ndikuyika zolemba zathu pamenepo. Mitsinje iwiri (Host ndi Output) yochokera kumakina akutali idasinthidwa ndikubwerera, pomwe mtsinje wa Output, wokhala ndi mtengo umodzi wa digito mmenemo, unasinthidwa kukhala mtundu wa Int32 ndipo motero umadutsa kumbali yolandira, ndipo mbali yolandirayo idagwiritsa ntchito. monga khodi yotuluka ya woyimbayo powershell.

Ndipo monga cheke chomaliza, tiyeni tipange ntchito imodzi pa seva ya SQL ndi mtundu wa "Operating System (cmdexec)" ndi mawu otsatirawa:

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

WOYA! Ntchitoyo idamalizidwa ndi cholakwika, lembani mu chipika:

ВыполняСтся ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ: DOMAINagentuser. Out to host. ExitCode: 6.  Код Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса 6.  Π¨Π°Π³ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ с ошибкой.

Zotsatira:

  • Pewani kugwiritsa ntchito Write-Output ndi kutchula mawu osapatsidwa. Dziwani kuti kusuntha kachidindo kameneka kwinakwake kungapangitse zotsatira zosayembekezereka.
  • M'malemba omwe sanapangidwe kuti akhazikitse pamanja, koma kuti mugwiritse ntchito pamakina anu, makamaka pama foni akutali kudzera pa WINRM, chitani zolakwika pamanja kudzera pa Try/Catch, ndikuwonetsetsa kuti, pazochitika zilizonse, script iyi imatumiza mtundu umodzi wakale. . Ngati mukufuna kupeza Errorlevel yachikale, mtengowu uyenera kukhala nambala.

Source: www.habr.com

Kuwonjezera ndemanga