เปเบกเบทเปเบญเบชเปเบฒเบเบงเบดเบเบตเบเบฒเบเบเบญเบเบเปเบญเบเปเบญเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบธเปเบกเบเบญเบเบเบฒเบเบชเปเบฒเบฎเบญเบเบเปเปเบกเบนเบเปเบเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบ MS-SQL เบซเบผเบฒเบ, เบเปเบญเบเปเบเปเปเบงเบฅเบฒเบซเบผเบฒเบเปเบเบเบฒเบเบชเบถเบเบชเบฒเบเบปเบเปเบเบเบฒเบเบเปเบฒเบเบเบญเบเบเปเบฒเปเบ Powershell เปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเปเบเบเบฒเบเปเบ, เบเบฑเปเบเบเบฑเปเบเบเปเบญเบเบเปเบฒเบฅเบฑเบเบเบฝเบเปเบเบทเบญเบเบเบฑเบเบเบปเบงเปเบญเบเปเบเบเปเบฅเบฐเบเบตเบเบตเปเบกเบฑเบเปเบเบฑเบเบเบฐเปเบซเบเบ. เบเบฑเบเบเบปเบเบญเบทเปเบ.
เบเบฑเปเบเบเบฑเปเบ, เปเบซเปเปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบ script เบเปเบฒเบเปเปเบฅเบฐเบเปเบฒเปเบเบตเบเบเบฒเบเบขเบนเปเปเบเบเปเบญเบเบเบดเปเบ:
$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 เบซเบผเบทเบเบฝเบเปเบเปเบชเบฐเปเบเบเบญเบญเบเปเบเบเบเปเปเปเบเปเบกเบญเบเบซเบกเบฒเบเปเบซเปเบเบปเบงเปเบเปเบเป (เปเบฅเบฐเบเบตเปเบซเบกเบฒเบเปเบเบดเบเบเบปเบเปเบเปเบฎเบฑเบเปเบเบเปเบญเบเบเบฒเบ Output), เปเบเบดเบเปเบกเปเบเบงเปเบฒเบเบฐเบเปเบฒเปเบเบตเบเบเบฒเบเบขเบนเปเปเบเบเปเบญเบเบเบดเปเบ, เบเปเปเบกเบตเบซเบเบฑเบเบเบฐเบชเบฐเปเบเบเบขเบนเปเปเบเบซเบเปเบฒเบเป! เบเบตเปเปเบกเปเบเบเบปเบเบชเบฐเบเปเบญเบเบเบญเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเบเปเป powershell - เปเบเปเบฅเบฐเบเบฑเบเบเบฑเบเบกเบตเบเปเป Output เบเบญเบเบเบปเบเปเบญเบ, array เบเบทเบเบชเปเบฒเบเบเบทเปเบเบชเปเบฒเบฅเบฑเบเบกเบฑเบ, เปเบฅเบฐเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเบเบตเปเปเบเบปเปเบฒเปเบเปเบเบเบฑเปเบเปเบกเปเบเบเบทเบงเปเบฒเปเบเบฑเบเบเบปเบเบกเบฒเบเบฒเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบซเบเปเบฒเบเบตเป, Return operator เบเบฐเปเบเบตเปเบกเบเปเบฒเบเบฑเบเบเบทเบเปเบซเปเบเบทเบเบฑเบ. เบเปเปเปเบเบฑเบเบญเบปเบเบเบฐเบเบญเบเบชเบธเบเบเปเบฒเบเปเบฅเบฐเปเบญเบเบเบฒเบเบเบงเบเบเบธเบกเปเบเบซเบฒเบเบฑเบเบเบฑเบเบเบฒเบเปเบ. เปเบเบทเปเบญเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบ, เปเบซเปเบเบงเบเปเบฎเบปเบฒเปเบฅเปเบเบชเบฐเบเบดเบเบเปเปเปเบเบเบตเปเบขเบนเปเปเบเบเปเบญเบเบเบดเปเบ:
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 เบเบญเบเบเบปเบเปเบญเบ, เปเบฅเบฐเบเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบตเบเบเบฒเบ script เบเปเบฒเบญเบดเบเบเบฒเบ CMD, redirecting 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
เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบกเบฑเบเบเบฐเบขเบนเปเปเบเบซเบเปเบฒเบเป
Out to host.
ExitCode: 1
เปเบฅเบฐเปเบเปเบเบฅเป
Out to output.
1
เบญเบฑเบเบเบตเปเปเบเบตเบเบเบถเปเบเบเปเบญเบเบงเปเบฒ CMD เปเบเบตเบเบเบปเบง powershell, เปเบเบดเปเบ, เปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเปเปเบกเบตเบเปเบฒเปเบเบฐเบเปเบฒเบญเบทเปเบเป, เบเบฐเบชเบปเบกเบชเบญเบ threads (Host เปเบฅเบฐ Output) เปเบฅเบฐเปเบซเปเบเบงเบเปเบเบปเบฒเบเบฑเบ CMD, เปเบเบดเปเบเบชเบปเปเบเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเบเบตเปเปเบเปเบฎเบฑเบเปเบเบซเบฒเปเบเบฅเป, เปเบฅเบฐเปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบฒเบเปเบฅเปเบเบเบฒเบ powershell, เบชเบญเบเบเบฐเบเบนเปเบเบตเปเบกเบตเบขเบนเปเปเบเบเบเปเบฒเบเบซเบฒเบ, เปเบฅเบฐเบชเบฑเบเบเบฒเบฅเบฑเบ redirects เบเบฝเบเปเบเปเบกเบตเบเบปเบเบเบฐเบเบปเบ Output.
เบเบฑเบเบเบทเบเปเบเบซเบฒเบซเบปเบงเบเปเปเบเบปเปเบเบเป, เปเบซเปเบเบงเบเปเบฎเบปเบฒเบเบทเปเบเปเบฒเบงเปเบฒเบเบปเบงเปเบเบเบงเบฑเบเบเบธ .NET เบเบฒเบเปเบ powershell เบกเบตเบขเบนเปเปเบเบเบญเบกเบเบดเบงเปเบเบตเปเบเบทเปเบญเบเบเบฝเบง (เบซเบเบถเปเบ OS), เปเบกเบทเปเบญเปเบฅเปเบเบฅเบฐเบซเบฑเบเบซเปเบฒเบเปเบเบชเบญเบเบซเบผเบตเบเบเปเบฒเบ WSMAN, เบเบฒเบเปเบญเบเบงเบฑเบเบเบธเปเบเบตเบเบเบทเปเบเปเบเบเบเปเบฒเบ XML serialization, เปเบเบดเปเบเปเบฎเบฑเบเปเบซเปเบเบงเบฒเบกเบชเบปเบเปเบเปเบเบตเปเบกเปเบเบตเบกเบซเบผเบฒเบ. เบเบฑเบเบเบฒเบเบเบปเปเบเบเบงเปเบฒเบเบญเบเบเบงเบเปเบฎเบปเบฒ. เปเบซเปเบชเบทเบเบเปเปเบเบฒเบเบเบปเบเบฅเบญเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบเบเบเบฒเบเปเบฅเปเบเบฅเบฐเบซเบฑเบเบเปเปเปเบเบเบตเป:
$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) เปเบกเปเบเบเบทเบเบฎเบฑเบเบชเบฒเปเบงเป, เปเบเบดเปเบเปเบฎเบฑเบเปเบซเปเบเบงเบเปเบฎเบปเบฒเบกเบตเบเบงเบฒเบกเบซเบงเบฑเบเบชเปเบฒเบฅเบฑเบเบเบงเบฒเบกเบชเปเบฒเปเบฅเบฑเบ. เปเบซเปเบเบฐเบเบฒเบเบฒเบกเบเปเบญเบเปเบซเปเบเบฝเบเปเบเปเบซเบเบถเปเบเบเปเบฒเปเบ Output stream, เบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบฝเบ script เบเปเบฒเบญเบดเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบตเบเบเบฒเบเบซเปเบฒเบเปเบเบชเบญเบเบซเบผเบตเบ:
$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 เบเบญเบเบเบงเบเปเบฎเบปเบฒเบขเบนเปเบเบตเปเบเบฑเปเบ. เบชเบญเบเบชเบฒเบเบเปเปเบฒ (เปเบเบปเปเบฒเบเบฒเบเปเบฅเบฐเบเบปเบเบเบฐเบฅเบดเบ) เบเบฒเบเปเบเบทเปเบญเบเบซเปเบฒเบเปเบเบชเบญเบเบซเบผเบตเบเปเบเปเบเบทเบ serialized เปเบฅเบฐเบเปเบฒเบเบเบฑเบเบเบทเบเปเบเบเปเบญเบ, เปเบเบเบฐเบเบฐเบเบตเปเบเปเปเบฒเบญเบญเบ, เบเบตเปเบกเบตเบเปเบฒเบเบดเบเบดเบเบญเบเบเบฝเบงเบขเบนเปเปเบเบเบฑเปเบ, เปเบเปเบเบทเบเบเปเบฝเบเปเบเบฑเบเบเบฐเปเบเบ Int32 เปเบฅเบฐเบเบฑเปเบเบเบฑเปเบเบเบถเปเบเปเบเปเบเปเบฒเบเปเบเบเปเบฒเบเบฎเบฑเบ, เปเบฅเบฐเบเปเบฒเบเบฎเบฑเบเปเบเปเบกเบฑเบ. เปเบเบฑเบเบฅเบฐเบซเบฑเบเบญเบญเบเบเบญเบ powershell เบเบนเปเปเบ.
เปเบฅเบฐเปเบเบฑเบเบเบฒเบเบเบงเบเบชเบญเบเบชเบธเบเบเปเบฒเบ, เปเบซเปเบชเปเบฒเบเบงเบฝเบเบซเบเบถเปเบเบเบฑเปเบเบเบญเบเปเบเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบ SQL เบเปเบงเบเบเบฐเปเบเบ "เบฅเบฐเบเบปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบ (cmdexec)" เบเปเบงเบเบเปเปเบเบงเบฒเบกเบเปเปเปเบเบเบตเป:
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, เปเบฎเบฑเบเบเบฒเบเบเบฑเบเบเบฒเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเปเบงเบเบเบปเบเปเบญเบเปเบเบเบเปเบฒเบ Try/Catch, เปเบฅเบฐเปเบซเปเปเบเปเปเบเบงเปเบฒ, เปเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเปเบซเบเบเบฒเบเปเบเบเปเปเบเบฒเบก, เบชเบฐเบเบดเบเบเบตเปเบชเบปเปเบเบเปเบฒเบเบฐเปเบเบเปเบเบทเปเบญเบเบเบปเปเบเบขเปเบฒเบเปเบเปเบเบดเบ. . เบเปเบฒเบเปเบฒเบเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐเปเบเปเบฎเบฑเบ Errorlevel เบเบฅเบฒเบชเบชเบดเบ, เบเปเบฒเบเบตเปเบเปเบญเบเปเบเบฑเบเบเบปเบงเปเบฅเบ.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com