2012-01-17 16 views
4

我有一個PowerShell的功能,看起來像這樣的代碼:

try { 
    Invoke-SomethingThatFails 
} 
catch [System.Exception] { 
    Write-Error $_.Exception.Message; 
    return New-Object Namespace.CustomErrorType -Property @{ 
     'Code' = "Fail"; 
     "Message" = $_.Exception.Message; 
    } 
} 

現在唯一的問題是我也想設置$?爲$ false。這可能嗎?

+0

我沒有得到你想要的想。 $?是隻讀的,不能更改。 – mjsr 2012-01-17 20:53:06

+0

那麼我該如何表明該函數返回錯誤,這將使readonyl變量$?是假的? – 2012-01-17 20:58:28

+1

Ouu現在我得到你想要的東西了,當我爲Out-Default創建一個包裝以自動保存某個變量中的最後一個對象並響應url(來自Powershell In Action 2的想法)時,我有同樣的確切需求。這個想法很好,但我擰了$?變量。我使用的解決方法是創建一個個性化的$ MyErrorIndicator變量,我不喜歡太多,但是唯一讓我想到保留這些新功能的東西。 – mjsr 2012-01-17 21:42:36

回答

6

布魯斯Payettes' PowerShell In Action (Second Edition)

的$?如果整個操作成功,則變量將爲真,否則爲假。例如,如果任何操作寫入了錯誤 對象,則$?將被設置爲false,即使錯誤被丟棄 使用重定向。這是一個重要的點:這意味着即使錯誤不是 顯示,腳本 可以確定是否發生錯誤。

PowerShell運行時管理$?的值,並且在錯誤對象寫入管道時設置爲false。

更新這裏是你如何編寫一個錯誤的對象到管道,但不會終止它(管道):

function New-Error { 
    [CmdletBinding()] 
    param() 
    $MyErrorRecord = new-object System.Management.Automation.ErrorRecord ` 
     "", ` 
     "", ` 
     ([System.Management.Automation.ErrorCategory]::NotSpecified), ` 
     "" 
    $PSCmdlet.WriteError($MyErrorRecord) 
} 

$Error.Clear() 
Write-Host ('$? before is: ' + $?) 
New-Error 
Write-Host ('$? after is: ' + $?) 

輸出:

$? before is: True 

New-Error : 
At C:\...\....ps1:14 char:10 
+ New-Error <<<< 
    + CategoryInfo   : NotSpecified: (:String) [New-Error], Exception 
    + FullyQualifiedErrorId : New-Error 

$? after is: False 
+0

安迪,這一半回答我的問題。如何在管道上發生錯誤?我需要拋出異常嗎?如果是這樣,我把它返回一個對象是不可能的。 – 2012-01-17 21:08:11

+0

@JustinDearing使用我提供了一個使用腳本cmdlet的例子。 – 2012-01-17 21:48:05

+3

如果您查看「about_Functions_Advanced_Methods」的PowerShell幫助條目的「錯誤方法」和「寫入方法」部分(通過使用PowerShell中的Get-Help about_Functions_Advanced_Methods),您可以找到有關@Andy提供的技術的更多信息在他的回答中。具體而言,PowerShell幫助條目鏈接到以下有用的MSDN文章:[PSCmdlet.WriteError方法](http://go.microsoft.com/fwlink/?LinkId=142157)(可能爲英文網頁)。我提到這一點很簡單,因爲我發現MSDN對'$ PSCmdlet.WriteError'函數的解釋在閱讀這個答案時很有用。 – Jeffrey 2012-03-27 20:13:59

相關問題