Как сохранить 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 сообщать об исключении с удаленной машины, как если бы оно было вызвано локально, с той же информацией трассировки стека и в потоке ошибок?

Ответы на вопрос(3)

Ваш ответ на вопрос