Rov qab tus nqi los ntawm powershell invoke-command rau SQL Server tus neeg saib xyuas

Thaum tsim kuv tus kheej txoj kev tswj hwm kev thaub qab ntawm ntau lub MS-SQL servers, kuv tau siv sijhawm ntau los kawm txog cov txheej txheem kom dhau qhov muaj nuj nqis hauv Powershell thaum hu xov tooj rau cov chaw taws teeb, yog li kuv sau ntawv ceeb toom rau kuv tus kheej yog tias nws muaj txiaj ntsig. rau lwm tus.

Yog li, cia peb pib nrog tsab ntawv yooj yim thiab khiav nws hauv zos:

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

Txhawm rau khiav cov ntawv sau, kuv yuav siv CMD cov ntaub ntawv hauv qab no, Kuv yuav tsis suav nrog txhua zaus:

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

Ntawm qhov screen peb yuav pom cov hauv qab no:

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


Tam sim no cia peb khiav tib tsab ntawv ntawm WSMAN (remotely):

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

Thiab ntawm no yog qhov tshwm sim:

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

Zoo heev, Errorlevel tau ploj mus rau qhov chaw, tab sis peb yuav tsum tau txais tus nqi los ntawm tsab ntawv! Cia peb sim ua qhov kev tsim kho hauv qab no:

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

Qhov no tseem nthuav. Cov lus hauv Output tau ploj mus qhov twg:

Out to host.
ExitCode: 2
ERRORLEVEL=0

Tam sim no, raws li kev hais lus tsis txaus ntseeg, kuv yuav nco ntsoov tias yog hauv Powershell muaj nuj nqi koj sau Sau-Cov Lus Qhia lossis tsuas yog ib qho kev qhia yam tsis tau muab nws rau ib qho txawv txav (thiab qhov no implicitly implies output rau Output channel), ces txawm tias thaum khiav hauv zos, tsis muaj dab tsi yuav tshwm sim ntawm qhov screen! Qhov no yog qhov tshwm sim ntawm lub powershell pipeline architecture - txhua txoj haujlwm muaj nws tus kheej tso zis pipeline, ib qho array yog tsim rau nws, thiab txhua yam uas nkag mus rau hauv nws yog suav tias yog qhov tshwm sim ntawm kev ua haujlwm, tus neeg teb xov tooj rov qab ntxiv tus nqi rov qab rau tib yam. pipeline raws li lub caij kawg thiab hloov chaw tswj mus rau kev hu xov tooj. Txhawm rau piav qhia, cia peb khiav cov ntawv hauv qab no hauv zos:

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

Thiab ntawm no yog qhov tshwm sim:

Main: ParameterValue

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

Lub luag haujlwm tseem ceeb (ntawv lub cev) kuj muaj nws tus kheej tso zis pipeline, thiab yog tias peb khiav thawj tsab ntawv los ntawm CMD, redirecting cov zis rau ib cov ntaub ntawv,

PowerShell .TestOutput1.ps1 1 > TestOutput1.txt

ces peb yuav pom ntawm qhov screen

ERRORLEVEL=1

thiab hauv cov ntaub ntawv

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

yog tias peb ua qhov zoo sib xws los ntawm powershell

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

ces nws yuav nyob ntawm qhov screen

Out to host.
ExitCode: 1

thiab hauv cov ntaub ntawv

Out to output.
1

Qhov no tshwm sim vim hais tias CMD launches powershell, uas, thaum tsis muaj lwm cov lus qhia, sib tov ob threads (Host thiab Output) thiab muab lawv rau CMD, uas xa txhua yam nws tau txais mus rau ib daim ntawv, thiab nyob rau hauv cov ntaub ntawv ntawm khiav los ntawm powershell, ob txoj xov no muaj nyob sib cais, thiab cov cim redirects tsuas yog cuam tshuam cov Output.

Rov qab mus rau lub ntsiab lus tseem ceeb, cia peb nco ntsoov tias .NET khoom qauv hauv powershell muaj tag nrho nyob rau hauv ib lub computer (ib OS), thaum khiav code remotely ntawm WSMAN, kev hloov ntawm cov khoom tshwm sim los ntawm XML serialization, uas coj ib tug ntau ntawm kev txaus siab. rau peb kev tshawb fawb. Cia peb txuas ntxiv peb qhov kev sim los ntawm kev khiav cov cai hauv qab no:

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

Thiab qhov no yog qhov peb muaj ntawm qhov screen:

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

Cov txiaj ntsig zoo! Nws txhais tau hais tias thaum hu rau Invoke-Command, kev faib cov kav xa mus rau hauv ob txoj xov (Host thiab Output) yog khaws cia, uas ua rau peb muaj kev cia siab rau kev vam meej. Cia peb sim tawm tsuas yog ib qho txiaj ntsig hauv Cov Tso Tawm Tawm, uas peb yuav hloov pauv thawj tsab ntawv uas peb khiav remotely:

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

Cia peb khiav nws zoo li no:

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

thiab... YOG, nws zoo li yeej!

Out to host.
ExitCode: 4

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


ERRORLEVEL=4

Cia peb sim seb yuav ua li cas. Peb hu ua powershell hauv zos, uas nyob rau hauv lem hu ua powershell ntawm lub computer tej thaj chaw deb thiab tua peb tsab ntawv muaj. Ob lub kwj (Tus Tswv thiab Tso Tawm) los ntawm lub tshuab tej thaj chaw deb tau serialized thiab dhau rov qab, thaum cov kwj tawm, muaj ib tus nqi digital hauv nws, tau hloov mus rau hom Int32 thiab xws li dhau mus rau sab txais, thiab sab txais siv nws. raws li txoj cai tawm ntawm tus hu powershell.

Thiab raws li kev txheeb xyuas zaum kawg, cia peb tsim txoj haujlwm ib kauj ruam ntawm SQL neeg rau zaub mov nrog hom "Operating system (cmdexec)" nrog cov ntawv hauv qab no:

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

HOORAY! Txoj haujlwm ua tiav nrog qhov yuam kev, cov ntawv hauv lub cav:

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

Cov lus xaus:

  • Tsis txhob siv Sau-Tshaj Tawm thiab qhia meej cov kab lus yam tsis muaj haujlwm. Nco ntsoov tias kev txav tus lej no mus rau lwm qhov hauv tsab ntawv yuav ua rau cov txiaj ntsig tsis xav tau.
  • Hauv cov ntawv sau tsis yog rau kev tshaj tawm phau ntawv, tab sis siv rau hauv koj cov txheej txheem automation, tshwj xeeb tshaj yog rau cov chaw taws teeb hu xov tooj ntawm WINRM, ua phau ntawv yuam kev tuav ntawm Sim / Catch, thiab xyuas kom meej tias, hauv txhua qhov kev txhim kho ntawm cov xwm txheej, tsab ntawv no xa mus raws nraim ib yam khoom qub. . Yog tias koj xav tau qhov yuam kev classic, tus nqi no yuav tsum yog tus lej.

Tau qhov twg los: www.hab.com

Ntxiv ib saib