ืืฉืืฆืจืชื ืืชืืืืืืืื ืืฉืื ืื ืืืื ืืืืืืื ืืืกืคืจ ืฉืจืชื 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 ืื ืจืง ืืืืื ืืืื ืืืงืฆืืช ืืืชื ืืฉืื ืืฉืชื ื (ืืื ืืจืื ืืืืคื ืืจืืื ืขื ืคืื ืืขืจืืฅ ื-Output), ืื ืื ืืืฉืจ ืืื ืคืืขื ืืืืคื ืืงืืื, ืฉืื ืืืจ ืื ืืืฆื ืขื ืืืกื! ืื ืชืืฆืื ืฉื ืืจืืืืงืืืจืช ื-powershell pipeline - ืืื ืคืื ืงืฆืื ืืฉ ืฆืื ืืจ Output ืืฉืื, ื ืืฆืจ ืขืืืจื ืืขืจื ืืื ืื ืฉื ืื ืก ืืืื ื ืืฉื ืืชืืฆืื ืฉื ืืืฆืืข ืืคืื ืงืฆืื, ืืืืคืจืืืจ Return ืืืกืืฃ ืืช ืขืจื ืืืืืจื ืืืืชื ืืืืจ. pipeline ืืืืื ื ืืืืจืื ืืืขืืืจ ืืช ืืฉืืืื ืืคืื ืงืฆืืืช ืืงืจืืื. ืืฉื ืืืืฉื, ืืื ื ืจืืฅ ืืช ืืกืงืจืืคื ืืื ืืืืคื ืืงืืื:
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, ืฉืืืืขืืจ ืืืจืืืช ืืืจืืช, ืืขืจืื ืฉื ื ืฉืจืฉืืจืื (Host ื-Output) ืื ืืชื ืืืชื ื-CMD, ืฉืฉืืื ืืช ืื ืื ืฉืืื ืงืืื ืืงืืืฅ, ืืืืงืจื ืฉื ืืฉืงื ื-powershell, ืฉื ื ืืฉืจืฉืืจืื ืืืื ืงืืืืื ืื ืคืจื, ืืืคื ืืืช ืืืืฉ ืฉื ืืกืื ืืฉืคืืขืืช ืจืง ืขื ืคืื.
ื ืืืืจ ืื ืืฉื ืืจืืฉื, ืืื ื ืืืืจ ืฉืืืื ืืืืืืืงื .NET ืืชืื powershell ืงืืื ืืืืืื ืืชืื ืืืฉื ืืื (ืืขืจืืช ืืคืขืื ืืืช), ืืืฉืจ ืืคืขืืืื ืงืื ืืจืืืง ืืืืฆืขืืช 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 ืืืืฉื ืืืจืืืง ืืืืฆืขื ื ืืช ืืกืงืจืืคื ืฉืื ื ืฉื. ืฉื ื ืืจืืื (Host ื-Output) ืืืืืื ื ืืืจืืืงืช ืืืขืืจื ืืกืืืจื ืืืืขืืจื ืืืจื, ืืขืื ืฉืืจื ื-Output, ืืขื ืขืจื ืืืืืืื ืืืื, ืืืืจ ืืกืื 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