2012-01-17 17 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にする。これは可能ですか?ブルースPayettes' PowerShell In Action (Second Edition)から

+0

私は何をあなたを得ることはありません欲しいです。 $?読み取り専用であり、変更できません。 – mjsr

+0

どうすれば関数がエラーで返されたことを示すことができますか?これはreadonyl変数$を作るでしょうか?偽であることは? –

+1

私はあなたが欲しいものを手に入れました.Out-Defaultのラッパーを作成して、変数の最後のオブジェクトを自動的に保存し、URL(Powershell In Action 2からのアイデア)に応答する必要があります。そのアイデアは素晴らしかったが、私は$をねじ込んだ?変数。私が使用する回避策は、カスタマイズされた$ MyErrorIndicator変数を作成することでしたが、あまり好きではありませんでしたが、これらの新しい機能を維持するためには私の心に唯一のことでした。 – mjsr

答えて

6

$?変数は、操作全体が成功した場合はtrue、それ以外の場合は 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

Andy、その半分は私の質問に答えます。パイプラインでエラーをどうやって得ますか?私は例外を投げる必要がありますか?もしそうなら、私はそれを取り戻すことは不可能です。 –

+0

@JustinDearing Using私は、スクリプトコマンドレットの使用方法の例を提供しました。 –

+3

あなたが「エラーメソッド」と(PowerShellで 'は、Get-ヘルプabout_Functions_Advanced_Methods'を使用して)「about_Functions_Advanced_Methods」のためのPowerShellのヘルプ項目の「書く方法」の項を見れば、あなたは@Andyが提供する技術に関する詳細な情報を見つけることができます彼の答えで具体的には、PowerShellヘルプエントリは、次の便利なMSDN記事[PSCmdlet.WriteError Method](http://go.microsoft.com/fwlink/?LinkId=142157)にリンクしています。 MSDNの '$ PSCmdlet.WriteError'関数の説明が、この答えを読むときに役立つことがわかったからです。 – Jeffrey

関連する問題