เบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปˆเบฒเบˆเบฒเบ powershell invoke-command เป„เบ›เบซเบฒเบ•เบปเบงเปเบ—เบ™ SQL Server

เป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบญเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฎเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ 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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™