2011-01-20 64 views
5

假設我有以下代碼,當發生錯誤時,我想看到錯誤首先發生在函數b處,然後發生在函數a處。但實際上它只是告訴我的錯誤發生在功能,因爲功能可以被稱爲很多次,我不知道哪個外部函數調用功能的問題造成的powershell:如何在錯誤發生時打印總調用堆棧?

cls 
function a{ 
    Remove-Item "not-exist-item" 
} 
function b{ 
    a 
} 
b 
Remove-Item : Cannot find path 'C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\not-exis 
t-item' because it does not exist. 
At C:\Users\Daniel.Wu\AppData\Local\Temp\2\a.ps1:***3 char:14*** 
+ Remove-Item <<<< "not-exist-item" 
    + CategoryInfo   : ObjectNotFound: (C:\Program File...\not-exist-item:String) [Remove-Item], ItemNotFoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand 

回答

5

如果您使用的是PowerShell v2.0,請使用Get-PSCallStack。如果你仍然在V1,使用這樣的函數:

function Get-CallStack { 
    trap { continue } 
    1..100 | foreach { 
     $var = Get-Variable -scope $_ MyInvocation 
     $var.Value.PositionMessage -replace "`n" 
    } 
} 
1

獲取幫助about_debuggers是否提供任何照明?

4

一種選擇是設置

$ErrorActionPreference = 'inquire' 

,然後調用問題腳本。出錯時,系統會提示您進行選擇,請選擇Suspend以進入嵌套提示模式。然後鍵入

Get-PSCallStack 

甚至

Get-PSCallStack | fl 

獲得當前調用堆棧信息。