Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ значСния ΠΈΠ· 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 ΠΈΠ»ΠΈ просто Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· присваивания Π΅Π³ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π° это нСявно ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Π² ΠΊΠ°Π½Π°Π» Output), Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ локальном запускС Π½Π° экран Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ! Π­Ρ‚ΠΎ слСдствиС ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π½ΠΎΠΉ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ powershell β€” каТдая функция ΠΈΠΌΠ΅Π΅Ρ‚ собствСнный ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Output, для Π½Π΅Π³ΠΎ создаСтся массив, ΠΈ всС, Ρ‡Ρ‚ΠΎ Π² Π½Π΅Π³ΠΎ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚, считаСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ 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

Главная функция (Ρ‚Π΅Π»ΠΎ скрипта) Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ свой ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Output, ΠΈ Ссли ΠΌΡ‹ запустим ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ скрипт ΠΈΠ· 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 эти Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, ΠΈ символ пСрСнаправлСния влияСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Output.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ основной Ρ‚Π΅ΠΌΠ΅, вспомним, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ модСль .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), Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ Π½Π°Π΄Π΅ΠΆΠ΄Ρƒ Π½Π° успСх. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ 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, ΠΈ Π΄ΠΎΠ±ΠΈΠ²Π°ΠΉΡ‚Π΅ΡΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ любом Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠΈ событий этот скрипт ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» Π² ΠΏΠΎΡ‚ΠΎΠΊ Output Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Если Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ классичСский Errorlevel β€” это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ числовым.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ