2017-07-27 65 views
0

參照當前對象我希望能夠提及$_對象在catch塊從我在catch塊調用這樣的功能:來自不同範圍

function foo 
{ 
    $something = ((Get-Variable -Name "_" -Scope 1).Value).Exception.Message 
    Write-Host $something 
} 

我想在這樣的情況下使用此:

foo #write-host should print empty line 
try { 
    throw 
} catch { 
    foo #write-host should print $_.Exception.Message from this catch block 
} 

如何正確地做到這一點? 我的目標是避免每次在catch塊中使用它時將$_作爲參數傳遞給foo,並且當我調用foo而不是在catch塊中時不打印任何內容。

我也試過這樣:

function foo 
{ 
    $something = (($ExecutionContext.SessionState.PSVariable.Get("_")).Value).Exception.Message 
    Write-Host $something 
} 

這似乎產生交互工作時,但不能啓動腳本時,我想要的結果。

+0

有一個全局'$ error'變量。 '$ error [0]'保存遇到的最後一個錯誤。 –

+0

它是全局的事實在調用「foo」不在catch塊中時會產生不想要的結果,在這種情況下,我不希望它返回它從上一個catch塊中保存的最後一個錯誤。 –

+0

坦率地說,我會給'foo()'一個默認值爲'$ null'的參數,並在catch塊中調用'foo $ _'。僅當參數的類型爲[[Management.Automation.ErrorRecord]'時才輸出異常消息。 –

回答

2

這樣做的清潔方式,當然,在foo(可選的)參數,從catch塊調用foo $_。這使得它完全清楚我們要求foo,它沒有問題的範圍,它使得foo可測試,所有的好處。您會在大多數打印錯誤的東西中看到這種方法(例如,在this question的答案中)。

即便如此,如果你上採摘從父幀錯誤變量堅持,這是可以做到:

function foo { 
    $lastError = (Get-PSCallStack)[1].GetFrameVariables()["_"].Value 
    if ([Object]::ReferenceEquals($lastError.Exception, $error[0].Exception)) { 
     $lastError.Exception.Message 
    } 
} 

注意與Object.ReferenceEquals額外的掛羊頭賣狗肉,以絕對確保$_是指最後一個錯誤記錄,而不是一些任意的管道項目(這也使用$_)。如果錯誤記錄本身在流水線中(例如$error |% { foo }),這將使仍然失敗,但此時您可能稱之爲功能。