แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ powershell invoke-command-แƒ“แƒแƒœ SQL Server แƒแƒ’แƒ”แƒœแƒขแƒ–แƒ”

แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ MS-SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” แƒกแƒแƒ แƒ”แƒ–แƒ”แƒ แƒ•แƒ แƒแƒกแƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ›แƒ”แƒ—แƒแƒ“แƒแƒšแƒแƒ’แƒ˜แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒกแƒแƒก, แƒ›แƒ” แƒ“แƒ˜แƒ“แƒ˜ แƒ“แƒ แƒ แƒ’แƒแƒ•แƒแƒขแƒแƒ แƒ” Powershell-แƒจแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒแƒ–แƒ” แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒ˜ แƒ–แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒก, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒฉแƒ”แƒ›แƒก แƒ—แƒแƒ•แƒก แƒ•แƒฌแƒ”แƒ  แƒจแƒ”แƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒแƒก, แƒ—แƒฃ แƒ”แƒก แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ. แƒกแƒฎแƒ•แƒแƒก.

แƒแƒกแƒ” แƒ แƒแƒ›, แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒ— แƒ“แƒ แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒ˜แƒ’แƒ˜ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“:

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

แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“, แƒ›แƒ” แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ CMD แƒคแƒแƒ˜แƒšแƒก, แƒงแƒแƒ•แƒ”แƒš แƒฏแƒ”แƒ แƒ–แƒ” แƒแƒ  แƒฉแƒแƒ•แƒ แƒ—แƒแƒ• แƒ›แƒแƒก:

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

แƒ”แƒ™แƒ แƒแƒœแƒ–แƒ” แƒ•แƒœแƒแƒฎแƒแƒ•แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒก:

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


แƒแƒฎแƒšแƒ แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ WSMAN-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ— (แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒแƒ“):

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 แƒแƒœ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒœแƒแƒ—แƒฅแƒ•แƒแƒ›แƒก แƒ แƒแƒ˜แƒ›แƒ” แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ›แƒ˜แƒœแƒ˜แƒญแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” (แƒ“แƒ แƒ”แƒก แƒ˜แƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒแƒ แƒฎแƒ–แƒ”), แƒ›แƒแƒจแƒ˜แƒœแƒแƒช แƒ™แƒ˜, แƒ แƒแƒชแƒ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก, แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒแƒ  แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒ”แƒ™แƒ แƒแƒœแƒ–แƒ”! แƒ”แƒก แƒแƒ แƒ˜แƒก powershell แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜แƒก แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜ - แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก แƒแƒฅแƒ•แƒก แƒ—แƒแƒ•แƒ˜แƒกแƒ˜ แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜, แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒ›แƒแƒกแƒ˜แƒ•แƒ˜ แƒ“แƒ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜, แƒ แƒแƒช แƒ›แƒแƒกแƒจแƒ˜ แƒจแƒ”แƒ“แƒ˜แƒก, แƒ˜แƒ—แƒ•แƒšแƒ”แƒ‘แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, Return แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ‘แƒก แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก แƒ˜แƒ›แƒแƒ•แƒ”แƒก. แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜, แƒ แƒแƒ’แƒแƒ แƒช แƒ‘แƒแƒšแƒ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜ แƒ“แƒ แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒ›แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก. แƒกแƒแƒ˜แƒšแƒฃแƒกแƒขแƒ แƒแƒชแƒ˜แƒแƒ“, แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“:

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

แƒ›แƒ—แƒแƒ•แƒแƒ  แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก (แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒกแƒฎแƒ”แƒฃแƒšแƒก) แƒแƒกแƒ”แƒ•แƒ” แƒแƒฅแƒ•แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜, แƒ“แƒ แƒ—แƒฃ แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒก CMD-แƒ“แƒแƒœ แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒ˜แƒ—, แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒคแƒแƒ˜แƒšแƒ–แƒ” แƒ’แƒแƒ“แƒแƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ,

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

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ˜แƒก แƒ”แƒ™แƒ แƒแƒœแƒ–แƒ” แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ

Out to host.
ExitCode: 1

แƒ“แƒ แƒคแƒแƒ˜แƒšแƒจแƒ˜

Out to output.
1

แƒ”แƒก แƒฎแƒ“แƒ”แƒ‘แƒ แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒ แƒแƒ› CMD แƒ’แƒแƒ›แƒแƒฃแƒจแƒ•แƒ”แƒ‘แƒก powershell-แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒฎแƒ•แƒ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒแƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒก แƒแƒ  แƒซแƒแƒคแƒก (แƒฐแƒแƒกแƒขแƒก แƒ“แƒ แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒก) แƒ“แƒ แƒแƒซแƒšแƒ”แƒ•แƒก แƒ›แƒแƒ— CMD-แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒก, แƒ แƒแƒช แƒ›แƒ˜แƒ˜แƒฆแƒ แƒคแƒแƒ˜แƒšแƒจแƒ˜, แƒ“แƒ Powershell-แƒ˜แƒ“แƒแƒœ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ”แƒก แƒแƒ แƒ˜ แƒซแƒแƒคแƒ˜ แƒชแƒแƒš-แƒชแƒแƒšแƒ™แƒ” แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ“แƒ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ’แƒแƒ•แƒšแƒ”แƒœแƒแƒก แƒแƒฎแƒ“แƒ”แƒœแƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ–แƒ”.

แƒ›แƒ—แƒแƒ•แƒแƒ  แƒ—แƒ”แƒ›แƒแƒก แƒ แƒแƒ› แƒ“แƒแƒ•แƒฃแƒ‘แƒ แƒฃแƒœแƒ“แƒ”แƒ—, แƒ’แƒแƒ•แƒ˜แƒฎแƒกแƒ”แƒœแƒแƒ—, แƒ แƒแƒ› 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-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒจแƒ”แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒแƒคแƒ แƒแƒ  แƒซแƒแƒคแƒแƒ“ (Host แƒ“แƒ Output), แƒ แƒแƒช แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒ›แƒ”แƒ“แƒก แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก. แƒจแƒ”แƒ•แƒ”แƒชแƒแƒ“แƒแƒ— แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒœแƒแƒ™แƒแƒ“แƒจแƒ˜ แƒ“แƒแƒ•แƒขแƒแƒ•แƒแƒ— แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ, แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒกแƒแƒช แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒชแƒ•แƒšแƒ˜แƒ— แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜แƒ•แƒ” แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒก, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒแƒ“ แƒ•แƒแƒขแƒแƒ แƒ”แƒ‘แƒ—:

$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 แƒ“แƒ แƒ˜แƒฅ แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜. แƒแƒ แƒ˜ แƒœแƒแƒ™แƒแƒ“แƒ˜ (แƒ›แƒแƒกแƒžแƒ˜แƒœแƒซแƒ”แƒšแƒ˜ แƒ“แƒ แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜) แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒ˜ แƒแƒžแƒแƒ แƒแƒขแƒ˜แƒ“แƒแƒœ แƒ˜แƒงแƒ แƒกแƒ”แƒ แƒ˜แƒฃแƒšแƒ˜ แƒ“แƒ แƒ’แƒแƒ“แƒแƒ”แƒชแƒ แƒฃแƒ™แƒแƒœ, แƒฎแƒแƒšแƒ แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒœแƒแƒ™แƒแƒ“แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒฅแƒ•แƒก แƒ”แƒ แƒ—แƒ˜ แƒชแƒ˜แƒคแƒ แƒฃแƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ, แƒ’แƒแƒ“แƒแƒ™แƒ”แƒ—แƒ“แƒ Int32 แƒขแƒ˜แƒžแƒแƒ“ แƒ“แƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒแƒกแƒ”แƒ—แƒ˜, แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒ“แƒ แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘ แƒ›แƒฎแƒแƒ แƒ”แƒก, แƒฎแƒแƒšแƒ แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜ แƒ›แƒฎแƒแƒ แƒ” แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ“แƒ แƒ›แƒแƒก. แƒ แƒแƒ’แƒแƒ แƒช แƒแƒ‘แƒแƒœแƒ”แƒœแƒขแƒ˜แƒก Powershell-แƒ˜แƒก แƒ’แƒแƒกแƒแƒกแƒ•แƒšแƒ”แƒšแƒ˜ แƒ™แƒแƒ“แƒ˜.

แƒ“แƒ แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒ”แƒ แƒ—แƒกแƒแƒคแƒ”แƒฎแƒฃแƒ แƒ˜แƒแƒœแƒ˜ แƒกแƒแƒ›แƒฃแƒจแƒแƒ SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” แƒขแƒ˜แƒžแƒ˜แƒก "แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ (cmdexec)" แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒ—:

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-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒก แƒ“แƒ แƒ’แƒแƒ›แƒแƒœแƒแƒ—แƒฅแƒ•แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒแƒก แƒ›แƒ˜แƒœแƒ˜แƒญแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒ’แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ—, แƒ แƒแƒ› แƒแƒ› แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ’แƒแƒœ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ˜แƒแƒก แƒ›แƒแƒฃแƒšแƒแƒ“แƒœแƒ”แƒšแƒ˜ แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜.
  • แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ”แƒ‘แƒจแƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ’แƒแƒœแƒ™แƒฃแƒ—แƒ•แƒœแƒ˜แƒšแƒ˜แƒ แƒแƒ แƒ แƒฎแƒ”แƒšแƒ˜แƒ— แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ”แƒ‘แƒจแƒ˜ แƒ’แƒแƒ›แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“, แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— WINRM-แƒ˜แƒก แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒ˜ แƒ–แƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ’แƒแƒแƒ™แƒ”แƒ—แƒ”แƒ— แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒšแƒ˜แƒ— แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ Try/Catch-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ“แƒแƒ แƒฌแƒ›แƒฃแƒœแƒ“แƒ˜แƒ—, แƒ แƒแƒ› แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ“แƒ แƒแƒก แƒ”แƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒ”แƒ แƒ— แƒžแƒ แƒ˜แƒ›แƒ˜แƒขแƒ˜แƒฃแƒš แƒขแƒ˜แƒžแƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก. . แƒ—แƒฃ แƒ’แƒกแƒฃแƒ แƒ— แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒ“แƒแƒœแƒ”, แƒ”แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜แƒ—แƒ˜.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ