如何获取在远程计算机上引发的异常的堆栈跟踪?
This question几乎相同,但是询问者对获得SerializedRemoteInvocationInfo.PositionMessage感到满意。我的情况有多个相互调用的脚本,因此我需要完整的调用堆栈才能了解我的问题。
以下代码段显示了一个空的堆栈跟踪:
$session = New-PSSession -ComputerName AComputer -UseSSL
$script = {C:\AScriptThatFails.ps1}
try{
Invoke-Command -Session $session -ScriptBlock $script
}
catch{
Write-Output = $_.Exception.SerializedRemoteException.StackTrace #Empty!?
}
答案 0 :(得分:1)
看起来错误记录的.ScriptStackTrace
属性包含远程脚本执行的堆栈跟踪:
try {
Invoke-Command -ErrorAction Stop -Session $session -ScriptBlock $script
}
catch {
$_ # output the error record
$_.ScriptStackTrace # output the script stack trace
}
请注意使用-ErrorAction Stop
将远程错误升级为脚本终止错误,以便try
/ catch
处理程序由 any 错误触发,不仅通过脚本终止的错误(即通过非终止和声明终止的错误)。
如果不希望这种升级,请使用以下技术:
$hadScriptTerminatingError = $false
try {
# User -ErrorVariable to collect the errors that occur.
Invoke-Command -Session $session -ScriptBlock $script -ErrorVariable errs
} catch { $hadScriptTerminatingError = $true }
$succeeded = $? -and -not $hadScriptTerminatingError
# Analyze the collected errors, if any.
foreach ($err in $errs) {
$err # output the error record
$err.ScriptStackTrace # output the script stack trace
}