我正在編寫一個執行我的構建/部署過程中的步驟之一的Powershell腳本,並且它需要在遠程計算機上運行一些操作。該腳本相對複雜,因此如果在遠程活動期間發生錯誤,我想要在腳本中發生錯誤的位置(超出已生成的日誌記錄的位置)進行詳細的堆棧跟蹤。如何在從遠程計算機上的Invoke-Command內引發的異常中保留ScriptStackTrace?
問題在於當從遠程計算機中繼終止異常時,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
如果我寫的異常輸出:
$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
但是,由於它不在錯誤流上,所以我的構建工具沒有正確拾取它。如果我嘗試寫入錯誤,我有類似的問題重新拋出異常和堆棧跟蹤指向腳本的錯誤部分。
所以我的問題是 - 我如何讓Powershell從遠程機器報告異常,就好像它已在本地提出的一樣,具有相同的堆棧跟蹤信息和錯誤流?
使用類似'Invoke-Command -ErrorVariable remoteerror'的東西,那麼結果錯誤流的lts應該在'$ remoteerror'中? – Matt
我把它收回'-ErrorVariable'不應該包含你需要的信息。我想我有一個想法想用'throw' – Matt
[本文](https://blogs.msdn.microsoft.com/powershell/2009/07/13/advanced-debugging-in-powershell/)上的任何內容對您有幫助? 「對於調試,而不是Invoke-Command,使用Enter-PSSession可能會更好,因此您可以在遠程計算機上有一個shell來嘗試輸出」 – user4317867