Я пишу сценарий Powershell, который выполняет один из шагов моего процесса сборки/развертывания, и ему нужно выполнить некоторые действия на удаленной машине. Сценарий относительно сложен, поэтому, если во время этого удаленного действия возникает ошибка, мне нужна подробная трассировка стека, где в сценарии произошла ошибка (помимо уже созданного журнала).
Проблема возникает в том, что Invoke-Command теряет информацию о трассировке стека при ретрансляции завершающих исключений с удаленной машины. Если блок сценария вызывается на локальном компьютере:
Invoke-Command -ScriptBlock {
throw "Test Error";
}
Возвращается необходимая информация об исключении:
Test Error
At C:\ScriptTest\Test2.ps1:4 char:2
+ throw "Test Error";
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Test Error:String) [], RuntimeException
+ FullyQualifiedErrorId : Test Error
Но если запустить удаленно:
Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
throw "Test Error";
}
Трассировка стека исключений указывает на весь блок Invoke-Command:
Test Error
At C:\ScriptTest\Test2.ps1:3 char:1
+ Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Test Error:String) [], RuntimeException
+ FullyQualifiedErrorId : Test Error
Я могу перенести исключение обратно на локальный компьютер вручную:
$exception = Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
try
{
throw "Test Error";
}
catch
{
return $_;
}
}
throw $exception;
Но при повторном вызове теряется трассировка стека:
Test Error
At C:\ScriptTest\Test2.ps1:14 char:1
+ throw $exception;
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Test Error:PSObject) [], RuntimeException
+ FullyQualifiedErrorId : Test Error
Если я пишу исключение в Output:
$exception = Invoke-Command -ComputerName $remoteComputerName -ScriptBlock {
try
{
throw "Test Error";
}
catch
{
return $_;
}
}
Write-Output $exception;
Я получаю правильную информацию о трассировке стека:
Test Error
At line:4 char:3
+ throw "Test Error";
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Test Error:String) [], RuntimeException
+ FullyQualifiedErrorId : Test Error
Но, поскольку его нет в потоке ошибок, мои инструменты сборки не распознают его правильно. Если я попробую Write-Error, у меня будет аналогичная проблема с повторным вызовом исключения, и трассировка стека указывает на неправильную часть сценария.
Итак, мой вопрос: как мне заставить Powershell сообщать об исключении с удаленной машины, как если бы оно было вызвано локально, с той же информацией о трассировке стека и в потоке ошибок?
Invoke-Command -ErrorVariable remoteerror
, тогда результаты потока ошибок должны быть в$remoteerror
? - person Matt   schedule 04.02.2016-ErrorVariable
не должно содержать нужной вам информации. Я думаю, что у меня есть идея с использованиемthrow
- person Matt   schedule 08.03.2016Enter-PSSession
в скриптах - person Frode F.   schedule 14.03.2016