Toe fa'afo'i se tau mai le powershell invoke-command i le sui SQL Server

I le fatuina o laʻu lava metotia mo le puleaina o faʻamaumauga i luga o le tele o sapalai MS-SQL, sa ou faʻaaluina le tele o le taimi e suʻesuʻe ai le faiga mo le pasiina o tulaga taua i Powershell i taimi o telefoni mamao, o lea ou te tusia ai se faamanatu ia te aʻu lava pe a aoga. i se isi tagata.

O lea la, tatou amata i se tusitusiga faigofie ma taʻavale i le lotoifale:

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

Ina ia faʻatautaia tusitusiga, o le a ou faʻaogaina le faila CMD nei, ou te le faʻaaofia i taimi uma:

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

I luga o le lau o le a tatou vaʻai i mea nei:

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


Ia tatou faʻataʻitaʻiina le tusitusiga lava e tasi e ala ile WSMAN (mamao):

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

Ma o le taunuuga lenei:

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

Sili, Errorlevel ua mou atu i se mea, ae e tatau ona tatou maua le tau mai le tusitusiga! Sei o tatou taumafai i le mamanu lenei:

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

E sili atu le manaia o lenei mea. Ua mou atu le fe'au i le Output i se mea:

Out to host.
ExitCode: 2
ERRORLEVEL=0

I le taimi nei, i le avea ai o se faʻasalalauga faʻasalalau, o le a ou matauina afai i totonu o le Powershell galuega e te tusia ai Tusi-Output pe naʻo se faʻamatalaga e aunoa ma le tuʻuina atu i soʻo se fesuiaiga (ma o lenei mea e faʻaalia ai le gaioiga i le Output channel), e tusa lava pe taʻavale i le lotoifale, e leai se mea e fa'aalia i luga o le lau! O se taunuuga lea o le fausaga o le paipa powershell - o galuega taʻitasi e iai lana lava Pipa Output, ua faia se laina mo ia, ma o mea uma e alu i totonu e manatu o le taunuuga o le faʻatinoga o galuega, o le Return operator e faʻaopoopo le tau toe faʻafoʻi i le tutusa. pipeline e avea ma elemene mulimuli ma faʻafeiloaʻi le pule i le galuega valaʻau. Mo se faʻataʻitaʻiga, seʻi o tatou faʻataʻitaʻiina le tusitusiga lenei i le lotoifale:

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

Ma o le taunuuga lenei:

Main: ParameterValue

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

O le galuega autu (script body) o loʻo i ai foi lana lava Pipa Pipa, ma afai tatou te faʻatautaia le tusitusiga muamua mai le CMD, toe faʻafeiloaʻi le gaioiga i se faila,

PowerShell .TestOutput1.ps1 1 > TestOutput1.txt

ona tatou vaai lea i luga o le lau

ERRORLEVEL=1

ma i le faila

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

pe a tatou faia se valaau faapena mai powershell

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

ona i ai lea i luga o le lau

Out to host.
ExitCode: 1

ma i le faila

Out to output.
1

E tupu lenei mea ona o le CMD e faʻalauiloa le malosi, lea, i le leai o isi faʻatonuga, faʻafefiloi filo se lua (Host and Output) ma tuʻuina atu i le CMD, lea e lafoina mea uma na maua i se faila, ma i le tulaga o le tatalaina mai le powershell, o nei filo e lua o loʻo i ai eseese, ma o le faʻailoga toe faʻafeiloaʻi naʻo le aʻafiaga o le Output.

Toe foi atu i le autu autu, ia tatou manatua o le .NET mea faitino faataitaiga i totonu o le powershell o loo i ai atoatoa i totonu o le komepiuta e tasi (tasi OS), pe a tamoe code remotely e ala i WSMAN, o le fesiitaiga o mea e tupu e ala i XML serialization, lea e aumaia ai le tele o le fiafia faaopoopo. ia matou su'esu'ega. Sei o tatou faʻaauau a tatou suʻega e ala i le faʻaogaina o le code lea:

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

Ma o le mea lenei o loʻo i luga o le lau:

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

Manaia le i'uga! O lona uiga pe a valaʻau Invoke-Command, o le vaevaega o paipa i ni filo se lua (Host and Output) o loʻo tausia, lea e maua ai le faʻamoemoe mo le manuia. Sei o tatou taumafai e tuʻu naʻo le tasi le tau i le Output stream, lea o le a tatou suia ai le uluaʻi tusitusiga tatou te tamoe mamao:

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

Se'i o tatou ta'e fa'apenei:

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

ma... IOE, e foliga mai o se manumalo!

Out to host.
ExitCode: 4

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


ERRORLEVEL=4

Sei o tatou taumafai e iloa le mea na tupu. Na matou valaʻau i le Powershell i le lotoifale, lea na taʻua ai le Powershell i luga o le komepiuta mamao ma faʻatino a matou tusitusiga iina. E lua vaitafe (Host and Output) mai le masini mamao na faʻapipiʻiina ma toe pasi i tua, aʻo le Output stream, o loʻo i ai se tau numera tasi i totonu, na liua e faʻapipiʻi Int32 ma o lea na pasi atu i le itu e mauaina, ma faʻaaogaina e le itu na mauaina. e pei o le fa'ailoga e alu i fafo o le atigi malosi o le telefoni.

Ma o se siaki mulimuli, seʻi o tatou faia se galuega e tasi-laasaga i luga o le SQL server ma le ituaiga "Operating system (cmdexec)" faʻatasi ai ma le tusiga o loʻo i lalo:

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

HOORAY! Ua mae'a le galuega i se mea sese, tusitusiga i totonu o le ogalaau:

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

Faaiuga:

  • Aloese mai le fa'aogaina o le Tusia-Autput ma fa'amaoti fa'amatalaga e aunoa ma se fa'atonuga. Ia nofouta o le fesiitaiga o lenei code i se isi mea i totonu o le tusitusiga e ono maua ai ni taunuuga e le'i mafaufauina.
  • I tusitusiga e leʻo faʻamoemoeina mo le faʻalauiloaina o tusi, ae mo le faʻaaogaina i au masini masini, aemaise lava mo telefoni mamao e ala i le WINRM, fai le faʻaogaina o mea sese e ala ile Try/Catch, ma faʻamautinoa, i soʻo se atinaʻe o mea tutupu, o lenei tusitusiga e auina atu saʻo lava le tasi le taua o le ituaiga. . Afai e te manaʻo e maua le Errorlevel masani, o lenei tau e tatau ona numera.

puna: www.habr.com

Faaopoopo i ai se faamatalaga