Ka hoʻihoʻi ʻana i kahi waiwai mai ka powershell invoke-command i SQL Server agent

I ka hana ʻana i kaʻu ʻano hana ponoʻī no ka hoʻokele ʻana i nā backup ma nā kikowaena MS-SQL he nui, ua hoʻohana au i ka manawa nui e aʻo i ka mīkini no ka hāʻawi ʻana i nā waiwai ma Powershell i nā kelepona mamao, no laila ke kākau nei au i mea hoʻomanaʻo iaʻu iho inā pono ia. i kekahi.

No laila, e hoʻomaka kākou me kahi palapala maʻalahi a holo i ka wahi:

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

No ka holo ʻana i nā palapala, e hoʻohana wau i kēia faila CMD, ʻaʻole wau e hoʻokomo i kēlā me kēia manawa:

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

Ma ka pale e ʻike mākou i kēia:

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


I kēia manawa, e holo kāua i ka palapala like ma WSMAN (mamao):

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

A eia ka hopena:

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

Nui, ua nalowale ʻo Errorlevel ma kahi, akā pono mākou e kiʻi i ka waiwai mai ka palapala! E ho'āʻo kākou i kēia kūkulu ʻana:

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

ʻOi aku ka hoihoi o kēia. Ua nalowale ka memo ma Output:

Out to host.
ExitCode: 2
ERRORLEVEL=0

I kēia manawa, ma ke ʻano he lyrical digression, e hoʻomaopopo wau inā i loko o kahi hana Powershell e kākau ai ʻoe i ka Write-Output a i ʻole kahi ʻōlelo me ka ʻole o ka hāʻawi ʻana iā ia i kekahi ʻano hoʻololi (a ʻo ia ka mea e hōʻike ana i ka hoʻopuka ʻana i ke kahawai Output), a laila ʻoiai e holo ana i ka wahi, ʻaʻohe mea e hōʻike ʻia ma ka pale! He hopena kēia o ka hoʻolālā pipeline powershell - aia kēlā me kēia hana i kāna pipeline Output ponoʻī, hana ʻia kahi ʻano no ia, a ʻo nā mea a pau e komo i loko e manaʻo ʻia ʻo ia ka hopena o ka hoʻokō hana, hoʻohui ka mea hoʻihoʻi i ka waiwai hoʻihoʻi i ka like. pipeline e like me ka mea hope loa a hoʻololi i ka mana i ka hana kelepona. No ka hōʻike ʻana, e holo kākou i kēia ʻatikala ma ka ʻāina:

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 eia ka hopena:

Main: ParameterValue

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

Loaʻa i ka hana nui (script body) kāna iho Output pipeline, a inā mākou e holo i ka palapala mua mai CMD, e hoʻihoʻi i ka hopena i kahi faila,

PowerShell .TestOutput1.ps1 1 > TestOutput1.txt

a laila e ʻike mākou ma ka pale

ERRORLEVEL=1

a ma ka waihona

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

inā mākou e hana i kahi kelepona like mai ka powershell

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

a laila aia ma ka pale

Out to host.
ExitCode: 1

a ma ka waihona

Out to output.
1

Hana ʻia kēia ma muli o ka hoʻomaka ʻana o ka CMD i ka powershell, ka mea, me ka ʻole o nā ʻōlelo aʻoaʻo ʻē aʻe, e hui pū i ʻelua mau kaula (Host and Output) a hāʻawi iā lākou i ka CMD, nāna e hoʻouna i nā mea āpau i loaʻa i kahi faila, a i ka hihia o ka hoʻokuʻu ʻana mai ka powershell, noho kaʻawale kēia mau lola ʻelua, a ʻo ka hoʻihoʻi hou ʻana i ka hōʻailona e pili wale i ka Output.

Ke hoʻi nei i ke kumuhana nui, e hoʻomanaʻo kākou aia ka .NET object model inside powershell i loko o hoʻokahi kamepiula (hoʻokahi OS), i ka wā e holo ana i ke code mamao ma o WSMAN, hiki ke hoʻololi i nā mea ma o XML serialization, e lawe mai i ka nui o ka hoihoi hou. i kā mākou noiʻi. E hoʻomau i kā mākou hoʻokolohua ma ka holo ʻana i kēia code:

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

A eia kā mākou i ka pale:

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

Nui ka hopena! ʻO ia ke ʻano o ke kāhea ʻana iā Invoke-Command, mālama ʻia ka mahele o nā pipeline i ʻelua mau kaula (Host and Output), e hāʻawi iā mākou i ka manaolana no ka kūleʻa. E ho'āʻo kākou e waiho i hoʻokahi waiwai ma ke kahawai Output, kahi e hoʻololi ai mākou i ka palapala mua loa a mākou e holo mamao ai:

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

E holo kakou penei:

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

a... ʻAe, me he mea lā he lanakila!

Out to host.
ExitCode: 4

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


ERRORLEVEL=4

E ho'āʻo kākou e noʻonoʻo i ka mea i hana ʻia. Ua kāhea mākou i ka powershell ma ka ʻāina, a ua kapa ʻia ʻo powershell ma ke kamepiula mamao a hoʻokō i kā mākou palapala ma laila. ʻElua mau kahawai (Host and Output) mai ka mīkini mamao i hoʻopaʻa ʻia a hoʻihoʻi ʻia, ʻoiai ʻo ke kahawai Output, me ka waiwai kikohoʻe hoʻokahi i loko, ua hoʻohuli ʻia e type Int32 a no laila ua hāʻawi ʻia i ka ʻaoʻao e loaʻa, a ua hoʻohana ka ʻaoʻao e loaʻa iā ia. e like me ke code puka o ka powershell kelepona.

A ma ke ʻano he loiloi hope, e hana mākou i kahi hana hoʻokahi ma ka server SQL me ke ʻano "Operating system (cmdexec)" me kēia kikokikona:

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

HOORAY! Ua hoʻopau ʻia ka hana me kahi hewa, kikokikona ma ka log:

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

Nā hopena:

  • E hōʻalo i ka hoʻohana ʻana i Kākau-Hana a me ka wehewehe ʻana i nā ʻōlelo me ka ʻole o ka hāʻawi ʻana. E makaʻala ʻo ka hoʻoneʻe ʻana i kēia code ma kahi ʻē aʻe i loko o ka palapala hiki ke loaʻa nā hopena i manaʻo ʻole ʻia.
  • Ma nā palapala i manaʻo ʻia ʻaʻole no ka hoʻomaka lima, akā no ka hoʻohana ʻana i kāu mau mīkini automation, ʻoi aku hoʻi no nā kelepona mamao ma o WINRM, e hana i ka hoʻoponopono hewa lima ma o Try/Catch, a e hōʻoia i kēlā, i ka hoʻomohala ʻana o nā hanana, hoʻouna kēia ʻatikala i hoʻokahi waiwai ʻano primitive. . Inā makemake ʻoe e kiʻi i ka Errorlevel maʻamau, pono kēia waiwai he helu.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka