ืืืขื ืืื ืฉืึทืคึฟื ืืืื ืืืืืขื ืข ืืขืืึทืืึทืืึทืืืฉื ืคึฟืึทืจ ืึธื ืคืืจืื ื ืืึทืงืึทืคึผืก ืืืืฃ ืงืืืคื 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
ืืจืืืก, ืขืจืจืืขืืืขื ืืื ืคืึทืจืฉืืืื ืื ืขืจืืขืฅ, ืึธืืขืจ ืืืจ ืืึทืจืคึฟื ืฆื ืืึทืงืืืขื ืื ืืืขืจื ืคืื ืื ืฉืจืืคื! ืืึธืืืจ ืคึผืจืืืืจื ืื ืคืืืืขื ืืข ืคึผืืึทื:
$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
ืืึธืก ืืื ื ืึธื ืืขืจ ืืฉืืงืึทืืืข. ืืขืจ ืึธื ืืึธื ืืื ืจืขืืืืืึทื ืืื ืคืึทืจืฉืืืื ืื ืขืจืืขืฅ:
Out to host.
ExitCode: 2
ERRORLEVEL=0
ืืืฆื, ืืื ืึท ืืืจืืงืึทื ืืืืจืขืฉืึทื, ืืื ืืืขื ืืึธื ืึทื ืืืื ืื ืึท Powershell ืคืื ืงืฆืืข ืืืจ ืฉืจืืึทืื Write-Output ืึธืืขืจ ื ืึธืจ ืึทื ืืืืกืืจืืง ืึธื ืึทืกืืื ืื ื ืขืก ืฆื ืงืืื ืืืขืจืืึทืืึทืื (ืืื ืืึธืก ืืืคึผืืืกืึทื ืืืคึผืืืื ืจืขืืืืืึทื ืฆื ืื ืจืขืืืืืึทื ืงืึทื ืึทื), ืืคืืื ืืืขื ืคืืืกื ืืืง ืืึธืืงืึทืื, ืืึธืจื ืืฉื ืืืขื ืืืื ืืขืืืืื ืืืืฃ ืืขื ืขืงืจืึทื! ืืึธืก ืืื ืึท ืงืึทื ืกืึทืงืืืึทื ืก ืคืื ืื Powershell ืจืขืจื - ืืื ืืข ืึทืจืงืึทืืขืงืืฉืขืจ - ืืขืืขืจ ืคึฟืื ืงืฆืืข ืืื ืืืื ืืืืืขื ืข ืจืขืืืืืึทื ืจืขืจื - ืืื ืืข, ืึท ืืขื ืืข ืืื ืืืฉืืคื ืคึฟืึทืจ ืืื, ืืื ืึทืืฅ ืืืึธืก ืืืื ืืื ืขืก ืืื ืืขืจืขืื ื ืืื ืืขืจ ืจืขืืืืืึทื ืคืื ืื ืคืื ืงืฆืืข ืืืจืืคืืจืื ื, ืืขืจ ืฆืืจืืง ืึธืคึผืขืจืึทืืึธืจ ืืืกืืฃ ืื ืฆืืจืืงืงืืืขื ืืืขืจื ืฆื ืื ืืขืืืข. ืจืขืจื - ืืื ืืข ืืื ืื ืืขืฆืืข ืขืืขืืขื ื ืืื ืืจืึทื ืกืคืขืจืก ืงืึธื ืืจืึธื ืฆื ืื ืคืึทื ืคืื ืงืฆืืข. ืฆื ืืืืืกืืจืืจื, ืืึธืื ืืื ืื ืืืืคื ืื ืคืืืืขื ืืข ืฉืจืืคื ืืึธืืงืึทืื:
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
ืืืื ืืืจ ืืึทืื ืึท ืขื ืืขื ืจืืคื ืคืื ืคึผืึธืืืขืจืฉืขืื
PS D:sqlagent> .TestOutput1.ps1 1 > TestOutput1.txt
ืืขืืึธืื ืขืก ืืืขื ืืืื ืืืืฃ ืืขื ืขืงืจืึทื
Out to host.
ExitCode: 1
ืืื ืืื ืืขืจ ืืขืงืข
Out to output.
1
ืืึธืก ืืึทืคึผืึทื ื ืืืืึทื ืื CMD ืืึธื ืืฉืื Powershell, ืืืึธืก, ืืื ืืขืจ ืึทืืืขืง ืคืื ืื ืืขืจืข ืืื ืกืืจืืงืฆืืขืก, ืืืงืกืขืก ืฆืืืื ืคึฟืขืืขื (ืืึธืกื ืืื ืจืขืืืืืึทื) ืืื ืืื ืืื ืฆื ืื CMD, ืืืึธืก ืกืขื ืื ืึทืืฅ ืขืก ืืืงืืืขื ืฆื ืึท ืืขืงืข, ืืื ืืื ืืขื ืคืึทื ืคืื ืืึธื ืืฉืื ื ืคึฟืื Powershell, ืื ืฆืืืื ืคึฟืขืืขื ืขืงืกืืกืืืจื ืกืขืคึผืขืจืึทืืื, ืืื ืื ืกืืืืึธื ืจืืืขืจืขืงืฅ ื ืึธืจ ืืืืจืงื ืจืขืืืืืึทื.
ืฆืืจืืง ืฆื ืืขืจ ืืืืคึผื ืืขืืข, ืืึธืื ืืื ืื ืืขืืขื ืงืขื ืึทื ืื .NET ืึธืืืืฉืขืงื ืืึธืืขื ืื ืคึผืึธืืืขืจืฉืขืื ืืึธืจ ืืืืืกืฅ ืืื ืืืื ืงืึธืืคึผืืืืขืจ (ืืืื ืึทืก), ืืืขื ืจืืืึธืืืื ืืืืคื ืงืึธื ืืืจื 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, ืื ืึธืคึผืืืื ืคืื ืื ืคึผืืืคึผืืืื ื ืืื ืฆืืืื ืคึฟืขืืขื (ืืึธืกื ืืื ืจืขืืืืืึทื) ืืื ืืืื ืืืื ื, ืืืึธืก ืืื ืืื ืื ืืึธืคืขื ืื ื ืคึฟืึทืจ ืืฆืืื. ืืึธืืืจ ืคึผืจืืืืจื ืฆื ืืึธืื ืืืืื ืืืื ืืืขืจื ืืื ืื ืจืขืืืืืึทื ืืืึทื, ืคึฟืึทืจ ืืืึธืก ืืืจ ืืืขืื ืืืืฉื ืื ืขืจืฉืืขืจ ืฉืจืืคื ืืืึธืก ืืืจ ืืืืคื ืจืืืึธืืืื:
$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
ืืืืืจ ืคืจืืืืจื ืืืืกืฆืืงืืขืจื ืืืืก ืืื ืืขืฉืขื. ืืืจ ืืขืจืืคื ืคึผืึธืืืขืจืฉืขืื ืืึธืืงืึทืื, ืืืึธืก ืืื ืงืขืจ ืืขืจืืคื ืคึผืึธืืืขืจืฉืขืื ืืืืฃ ืื ืืืืึทื ืงืึธืืคึผืืืืขืจ ืืื ืขืงืกืึทืงืืืืึทื ืืื ืืืขืจ ืฉืจืืคื ืืึธืจื. ืฆืืืื ืกืืจืืื (ืืึธืกื ืืื ืจืขืืืืืึทื) ืคืื ืื ืืืืึทื ืืึทืฉืื ืืขื ืขื ืกืืจืืึทืืืืื ืืื ืืืจืืืขืืื ืืขื ืฆืืจืืง, ืืฉืขืช ืื ืจืขืืืืืึทื ืืืึทื, ืืื ืึท ืืืื ืืืืืืึทื ืืืขืจื ืืื ืขืก, ืืื ืงืึธื ืืืขืจืืขื ืฆื ืืืคึผ Int32 ืืื ืืื ืึทืืึท ืืืจืืืขืืื ืืขื ืฆื ืื ืจืืกืืืืื ื ืืืึทื, ืืื ืื ืจืืกืืืืื ื ืืืึทื ืืขืืืืื ื ืขืก. ืืื ืืขืจ ืึทืจืืืกืืึทื ื ืงืึธื ืคืื ืื ืงืึทืืืขืจ ืคึผืึธืืืขืจืฉืขื.
ืืื ืืื ืึท ืืขืฆื ืืฉืขืง, ืืึธืื ืืื ืื ืืึทืื ืึท ืืืื-ืฉืจืื ืึทืจืืขื ืืืืฃ ืื ืกืงื ืกืขืจืืืขืจ ืืื ืืขื ืืืคึผ "ืึธืคึผืขืจืืืืื ื ืกืืกืืขื (ืงืืืขืงืกืขืง)" ืืื ืื ืคืืืืขื ืืข ืืขืงืกื:
PowerShell -NonInteractive -NoProfile "$res=Invoke-Command -ComputerName BACKUPSERVER -ConfigurationName SQLAgent -ScriptBlock {&'D:sqlagentTestOutput1.ps1' 6}; $host.SetShouldExit($res)"
HOORAY! ืื ืึทืจืืขื ืืื ืืขืขื ืืืงื ืืื ืึท ืืขืืช, ืืขืงืกื ืืื ืื ืงืืึธืฅ:
ะัะฟะพะปะฝัะตััั ะพั ะธะผะตะฝะธ ะฟะพะปัะทะพะฒะฐัะตะปั: DOMAINagentuser. Out to host. ExitCode: 6. ะะพะด ะทะฐะฒะตััะตะฝะธั ะฟัะพัะตััะฐ 6. ะจะฐะณ ะทะฐะฒะตััะธะปัั ั ะพัะธะฑะบะพะน.
ืงืึทื ืงืืืืฉืึทื ื:
- ืืืกืืืืื ื ืืฆื Write-Output ืืื ืกืคึผืขืฆืืคืืฆืืจื ืืืืกืืจืืงื ืึธื ืึทืกืืื ืืึทื ื. ืืืื ืึทืืืขืจ ืึทื ืืึธืืืื ื ืืขื ืงืึธื ืื ืืขืจืฉ ืืื ืื ืฉืจืืคื ืงืขื ืคึผืจืึธืืืฆืืจื ืืืืืขืจืืื ืจืขืืืืืึทืื.
- ืืื ืกืงืจืืคึผืก ืืืขื ื ืืฉื ืคึฟืึทืจ ืืึทื ืืึทื ืงืึทืืขืจ, ืึธืืขืจ ืคึฟืึทืจ ื ืืฆื ืืื ืืืื ืึธืืึทืืืืฉืึทื ืืขืงืึทื ืืืึทืื, ืกืคึผืขืฆืืขื ืคึฟืึทืจ ืืืืึทื ืงืึทืืืก ืืืจื WINRM, ืืึธื ืืึทื ืืึทื ืืขืืช ืืึทื ืืืื ื ืืืจื ืคึผืจืึผืืื / ืืึทืคึผื, ืืื ืขื ืฉืืจ ืึทื ืืื ืงืืื ืึทื ืืืืืงืืื ื ืคืื ืืขืฉืขืขื ืืฉื, ืืขื ืฉืจืืคื ืกืขื ืื ืคึผืื ืงื ืืืื ืคึผืจืืืืืืื ืืืคึผ ืืืขืจื . ืืืื ืืืจ ืืืืื ืฆื ืืึทืงืืืขื ืื ืงืืึทืกืืฉ Errorlevel, ืื ืืืขืจื ืืืื ืืืื ื ืืืขืจืืง.
ืืงืืจ: www.habr.com