MS-SQL áá¬áá¬áá»á¬ážá áœá¬ááœáẠá¡áááºáá°ážáá°ááŸá¯áá»á¬ážááᯠá á®áá¶ááá·áºááœá²áááºá¡ááœáẠáá»áœááºá¯ááºáááá¯ááºááá¯ááºáááºážá áá áºááᯠáááºáá®ážáá±á¬á¡áá«á á¡áá±ážááŸáá±á«áºááá¯ááŸá¯áá»á¬ážá¡ááœááºáž Powershell ááœáẠáááºááá¯ážáá»á¬ážááŒááºáááºážáááºááá¹ááá¬ážááᯠá¡áá»áááºá¡áá±á¬áºááŒá¬ áá±á·áá¬áá²á·ááá±á¬ááŒá±á¬áá·áº áááºážááẠá¡áá¯á¶ážáááºáá«á áá»áœááºá¯ááºááá¯ááºááá¯áẠááááá±ážáá»ááºáá±ážáá±áá«áááºá á¡ááŒá¬ážáá áºáá±á¬ááºáá¶ááá¯á·
áá®áá±á¬á·á ááá¯ážááŸááºážáá²á· script áá²á·á ááŒá®áž á ááºááœááºážááŸá¬ run ááŒáá¡á±á¬ááºá
$exitcode = $args[0]
Write-Host 'Out to host.'
Write-Output 'Out to output.'
Write-Host ('ExitCode: ' + $exitcode)
Write-Output $exitcode
$host.SetShouldExit($exitcode)
scripts áá»á¬ážááᯠrun áááºá áá»áœááºá¯ááºááẠá¡á±á¬ááºáá« CMD ááá¯ááºááᯠá¡áá¯á¶ážááŒá¯áááºááŒá áºááŒá®ážá áááºážááᯠá¡ááŒáááºááá¯ááºáž ááá·áºááœááºážáááºááá¯ááºáá«á
@Echo OFF
PowerShell .TestOutput1.ps1 1
ECHO ERRORLEVEL=%ERRORLEVEL%
á ááááºááœáẠá¡á±á¬ááºáá«ááá¯á·ááᯠáá»áœááºá¯ááºááá¯á· ááœá±á·ááááá·áºáááº-
Out to host.
Out to output.
ExitCode: 1
1
ERRORLEVEL=1
ááᯠWSMAN (á¡áá±ážááŸáá±á áá°áá®áá±á¬ script ááá¯áá¯á¶ážááŒáá·áºááŒáá«á
áá¯á·)á
Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
ááŒá®ážáá±á¬á· áá«á ááááºáá«á
Out to host.
Out to output.
ExitCode: 2
2
ERRORLEVEL=0
áá±á¬ááºážáááºá Errorlevel á áá áºáá±áá¬áá¬ááŸá¬ áá»á±á¬ááºááœááºááœá¬ážáá±ááá·áº áá¬ááºááœáŸááºážááá± áááºááá¯ážááᯠáááá¯á·ááá¯áááºá á¡á±á¬ááºáá«áááºáá±á¬ááºááŸá¯ááᯠá ááºážááŒáá·áºáá¡á±á¬ááºá
$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
áá«á ááá¯áá±á¬áẠá áááºáááºá á¬ážááá¯á·áá±á¬ááºážáááºá Output ááŸá áááºáá±á·áá»áºááẠáá áºáá±áá¬ááœáẠáá»á±á¬ááºááœááºááœá¬ážáááº-
Out to host.
ExitCode: 2
ERRORLEVEL=0
ááá¯á á á¬áá¬ážááœá²ááŒá¬ážááŸá¯áá áºáá¯á¡áá±ááŒáá·áº Powershell áá¯ááºáá±á¬ááºáá»ááºá¡ááœááºážááœáẠáááºááẠWrite-Output ááá¯á·ááá¯áẠáááºážááᯠáááºááá·áº variable ááœááºáá»áŸ ááááºááŸááºáá² (ááá¯á·ááŒáẠáááºážááẠOutput channel ááá¯á· ááœááºááá¯ááºáá±á¬áºááŒáá¬ážáá±á¬ á¡ááœááºááᯠááá¯ááá¯áááº) ááᯠáááááŒá¯áááááºááŒá áºááŒá®ážá ááá¯á·áá±á¬áẠá ááºááœááºážáááºáááºáá±áá»áááºááááºá áá»ááºááŸá¬ááŒááºáá±á«áºááœáẠáááºááá·áºá¡áá¬ááá¯áá»áŸ ááŒááááºááá¯ááºáá«á áááºážááẠpowershell ááá¯ááºááá¯ááºážáááá¯áá¬áá¡áá»áá¯ážáááºááŒá áºááẠ- áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯á á®ááœáẠáááºážáááá¯ááºááá¯áẠOutput ááá¯ááºááá¯ááºážáá«ááŸáááŒá®ážá áááºážá¡ááœáẠarray áá áºáá¯ááᯠáááºáá®ážáá¬ážááŒá®áž áááºážáá²ááá¯á·áááºááá»áŸá¡á¬ážáá¯á¶ážááᯠfunction execution áááááºá¡ááŒá áºáá°ááááºá Return operator á០return value ááá¯áá°áá®á áœá¬áááºáá±á«ááºážáá±ážááẠááá¯ááºááá¯ááºážááẠáá±á¬ááºáá¯á¶ážááŒááºá ááºá¡ááŒá áºááŸáá·áº ááááºážáá»á¯ááºááŸá¯ááᯠáá±á«áºááá¯ááŸá¯áá¯ááºáá±á¬ááºáá»ááºááá¯á· ááœáŸá²ááŒá±á¬ááºážáá±ážáááºá ááá¯ááºáá±á¬áºáááºá á¡á±á¬ááºáá« áá¬ááºááœáŸááºážááᯠá ááºááœááºážá áá¯ááºáá±á¬ááºááŒáá«á áá¯á·á
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: "+$_) }
ááŒá®ážáá±á¬á· áá«á ááááºáá«á
Main: ParameterValue
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
2
Main: Function: ParameterValue
Main: ReturnValue
áááºááá¯ááºáá±á¬ááºáá»áẠ(script body) ááœáẠáááºážáááá¯ááºááá¯áẠOutput pipeline áá«ááŸáááŒá®áž CMD á០ááááá¯á¶áž script ááᯠrun áá«á output ááᯠááá¯ááºáá áºáá¯ááá¯á· ááŒááºááœáŸááºážáá±ážááŒááºážá
PowerShell .TestOutput1.ps1 1 > TestOutput1.txt
ááŒá®ážááẠá ááááºáá±á«áºááŸá¬ ááœá±á·ááááá·áºáááºá
ERRORLEVEL=1
ááá¯ááºáá²ááŸá¬
Out to host.
Out to output.
ExitCode: 1
1
powershell á០á¡áá¬ážáá°áá±á«áºááá¯ááŸá¯áá áºáᯠááŒá¯áá¯ááºáá«áá
PS D:sqlagent> .TestOutput1.ps1 1 > TestOutput1.txt
ááá¯á·áá±á¬áẠscreen áá±á«áºááœááºáá±á«áºáá¬áááá·áºáááºá
Out to host.
ExitCode: 1
ááá¯ááºáá²ááŸá¬
Out to output.
1
CMD ááẠá¡ááŒá¬ážáá±á¬ ááœáŸááºááŒá¬ážáá»ááºáá»á¬áž ááá«ááŸááá² thread ááŸá áºáᯠ(Host ááŸáá·áº Output) ááᯠáá±á¬ááŸá±á¬áᬠááá¯ááºáá áºáá¯ááá¯á· áááºáá¶áááŸáááá»áŸááᯠáá±ážááá¯á·áá±ážááá·áº CMD ááá¯á· áá±ážáá±á¬ááºáá±á¬ááŒá±á¬áá·áº ááŒá áºáááŒááºážááŒá áºááŒá®ážá powershell á០á áááºááá·áº ááá á¹á ááœááºá á€á á¬ááœá²ááŸá áºáá¯ááẠáá®ážááŒá¬ážá á®áááºááŸáááŒá®áž áááºá¹áá±áááᯠááŒááºááœáŸááºážááá·áºá¡áá¬ááẠOutput ááá¯áᬠá¡áá»áá¯ážáááºáá±á¬ááºáááºá
á¡áááá¡ááŒá±á¬ááºážá¡áá¬ááá¯á·ááŒááºááœá¬ážáá±á¬á¡áá« powershell á¡ááœááºážááŸá .NET á¡áá¬ááá¹áá¯áá±á¬áºáááºááẠááœááºáá»á°áá¬áá áºáá¯á¶áž (OS áá áºáá¯á¡ááœááºáž) ááœáẠá¡ááŒáá·áºá¡áááŸáááŒá±á¬ááºážá WSMAN ááŸáá áºááá·áº á¡áá±ážááááºážáá¯ááºááᯠáá¯ááºáá±á¬ááºááá·áºá¡áá«á á¡áá¬ááá¹áá¯áá»á¬ážá ááœáŸá²ááŒá±á¬ááºážááŸá¯ááẠXML á¡ááŸááºá ááºááŒá¯áá¯ááºááŒááºážááŸáá áºááá·áº ááŒá áºáá±á«áºáááºá áááºážááẠá¡ááá¯á áááºáááºá á¬ážááŸá¯áá»á¬ážá áœá¬ááᯠáá°áá±á¬ááºáá¬áá«áááºá áá»áœááºá¯ááºááá¯á·ááá¯áá±ááá¡ááœááºá á¡á±á¬ááºáá«áá¯ááºááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·á á ááºážáááºááŸá¯áá»á¬ážááᯠáááºáááºáá¯ááºáá±á¬ááºááŒáá«á áá¯á·á
$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
$res.GetType()
$host.SetShouldExit($res)
á€áááºááŸá¬ áá»áœááºá¯ááºááá¯á·á áá»ááºááŸá¬ááŒááºáá±á«áºááœáẠááŸááá±ááẠá
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
ááááºáá±á¬ááºáž ááá¯ááá¯áááºááŸá¬ Invoke-Command ááá¯áá±á«áºááá¯áá±á¬á¡áá«ááœááºá ááá¯ááºááá¯ááºážáá»á¬ážááᯠthread ááŸá áºáᯠ(Host ááŸáá·áº Output) á¡ááŒá Ạááá¯ááºážááŒá¬ážáá¬ážáá±á¬ááŒá±á¬áá·áº á¡á±á¬ááºááŒááºááŸá¯áá»áŸá±á¬áºááá·áºáá»ááºáá±ážáááºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá±ážááŸá¡áá¯á¶ážááŒá¯áá±á¬ ááááá¯á¶áž script ááᯠááŒá±á¬ááºážáá²ááá·áº Output stream ááœáẠáááºááá¯ážáá áºáá¯áá¬áá»ááºááŸáá á±ááẠááŒáá¯ážá á¬ážááŒáá«á áá¯á·á
$exitcode = $args[0]
Write-Host 'Out to host.'
#Write-Output 'Out to output.'
Write-Host ('ExitCode: ' + $exitcode)
Write-Output $exitcode
$host.SetShouldExit($exitcode)
á€áá²á·ááá¯á· áá¯ááºáá±á¬ááºááŒáá«á áá¯á·á
$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
$host.SetShouldExit($res)
ááŸáá·áº... áá¯ááºáá«áááºá á¡á±á¬ááºááœá²áá áºáá¯ááá¯áá«áá²á
Out to host.
ExitCode: 4
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
ERRORLEVEL=4
ááŒá áºáá»ááºáá²á·áá¬ááᯠá¡ááŒá±ááŸá¬ááŒáá·áºáá¡á±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠá ááºááœááºážááŸá powershell áá¯áá±á«áºáááºá áááºážááẠá¡áá±ážááááºážááœááºááŒá°áá¬ááœáẠpowershell áá¯áá±á«áºááŒá®áž áá»áœááºá¯ááºááá¯á·á script ááᯠááá¯áá±áá¬ááœáẠáá¯ááºáá±á¬ááºáá²á·áááºá á¡áá±ážááááºážá ááºá០áá¯ááºááœáŸáá·áºáá»áẠááŸá áºáᯠ(Host ááŸáá·áº Output) ááᯠá¡ááŸááºá áẠááŒááºááŒá®áž ááŒááºáá±ážáá¬á áááºážááœáẠáá áºáá»á áºáááºáááºááá¯ážáá áºáá¯áá«ááŸááá±á¬ Output stream ááẠInt32 á¡áá»áá¯ážá¡á á¬ážááá¯á· ááŒá±á¬ááºážáá²ááœá¬ážááŒá®áž áááºáá¶ááá·áºáááºááá¯á· áá°ážááœá¬ážáᬠáááºáá¶ááá·áºáááºááŒááºážá áááºážááᯠá¡áá¯á¶ážááŒá¯áááºá áá±á«áºááá¯áá° powershell áááœááºáá±á«ááºáá¯ááºá¡ááŒá áºá
áá±á¬ááºáá¯á¶ážá á áºáá±ážááŸá¯á¡áá±ááŒáá·áºá á¡á±á¬ááºáá«á á¬áá¬ážááŒáá·áº "Operating system (cmdexec)" á¡áá»áá¯ážá¡á á¬ážááŒáá·áº SQL server ááœáẠá¡ááá·áºáá áºááá·áºá¡áá¯ááºáá áºáá¯ááᯠáááºáá®ážááŒáá«á áá¯á·á
PowerShell -NonInteractive -NoProfile "$res=Invoke-Command -ComputerName BACKUPSERVER -ConfigurationName SQLAgent -ScriptBlock {&'D:sqlagentTestOutput1.ps1' 6}; $host.SetShouldExit($res)"
áá°áž! á¡ááŸá¬ážá¡ááœááºážáá áºáá¯ááŒáá·áº ááŒá®ážááŒá±á¬ááºáá²á·áá±á¬ á¡áá¯ááºá ááŸááºáááºážááŸá á á¬ááá¯-
ÐÑпПлМÑеÑÑÑ ÐŸÑ ÐžÐŒÐµÐœÐž пПлÑзПваÑелÑ: DOMAINagentuser. Out to host. ExitCode: 6. ÐПЎ завеÑÑÐµÐœÐžÑ Ð¿ÑПÑеÑÑа 6. Каг завеÑÑОлÑÑ Ñ ÐŸÑОбкПй.
áá±á¬ááºáá»ááº:
- Write-Output ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŸáá·áº assignment ááá«áá² á áá¬ážáááºáá»á¬áž áááºááŸááºááŒááºážááᯠááŸá±á¬ááºááŒááºáá«á á€áá¯ááºááᯠáá¬ááºááœáŸááºážááŸá á¡ááŒá¬ážáá±áá¬ááá¯á· ááœáŸá±á·ááŒááºážááẠáá»áŸá±á¬áºááá·áºááá¬ážáá±á¬ ááááºáá»á¬áž ááœááºáá±á«áºááá¯ááºáááºááᯠáááááŒá¯áá«á
- áááºááŒáá·áºá áááºááŒááºážá¡ááœáẠáááºááœááºááá·áº script áá»á¬ážááœááºá á¡áá°ážáááŒáá·áº WINRM ááŸáá áºááá·áº á¡áá±ážááŸáá±á«áºááá¯ááŸá¯áá»á¬ážá¡ááœááºá áááºá á¡ááá¯á¡áá»á±á¬ááºá áá áºááá¯ááºáᬠááá¹ááá¬ážáá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯áááºá¡ááœááºá Try/Catch ááŸáá áºááá·áº áá°ááá¯ááºááá¯áẠá¡ááŸá¬ážá¡ááœááºážááŒá¯áá¯ááºáᬠááŒá áºáááºáá»á¬ážá ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááœááºá á€á ááá áºááẠáá°áá¡áá»áá¯ážá¡á á¬ážáááºááá¯ážáá áºáá¯á¡ááá¡áá»ááᯠáá±ážááá¯á·ááŒá±á¬ááºáž áá±áá»á¬áá«á á±á . áá°áá¡ááŸá¬ážá¡ááá·áºááᯠááá°ááá¯áá«áá á€áááºááá¯ážááẠááááºážááŒá áºááá«áááºá
source: www.habr.com