Как сохранить ScriptStackTrace в исключении, выданном из Invoke-Command на удаленном компьютере?
Я пишу сценарий 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
Я могу перенести exc, eption обратно на локальную машину вручную:
$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
Если я напишу исключение для вывода:
$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 сообщать об исключении с удаленной машины, как если бы оно было вызвано локально, с той же информацией трассировки стека и в потоке ошибок?