14

Powershell のWrite-Errorコマンドレットが機能しないのはなぜですか? 私の出力は、ドキュメントの例のようには見えません:

PS C:\> Write-Error "This is an error"
Write-Error "This is an error" : This is an error
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

次のような出力を期待していましたWrite-Warning

PS H:\> Write-Warning "This is a warning"
WARNING: This is a warning

Write-Errorおよびドキュメントから、about_preference_variables例外が表示されるべきではないと思いましたか?

PS H:\> Get-Help About_Preference_Variables

$ErrorActionPreference
----------------------

...

        PS> $erroractionpreference                      
        Continue        # Display the value of the preference.                

        PS> write-error "Hello, World"                  
                                # Generate a non-terminating error.

        write-error "Hello, World" : Hello, World       
                                # The error message is displayed and
                                  execution continues.

        PS> write-error "Hello, World" -ErrorAction:SilentlyContinue
                                # Use the ErrorAction parameter with a 
                                  value of "SilentlyContinue".
        PS>                                             
                                # The error message is not displayed and
                                  execution continues.
4

4 に答える 4

17

write-warning と同様の出力を得るには、次のようにします。

$Host.UI.WriteErrorLine("This is an error")

(この回答についてChris Searsに感謝します)

于 2011-04-13T19:53:31.730 に答える
6

うまくいっていると思わないのはなぜですか。PowerShell は、上記のような終了しないエラーと、実行時に発生するような終了するエラーを区別することに注意してくださいthrow 'Access denied.'。非終了エラーは stderr に書き込まれ、$error コレクションに記録されますが、スクリプトの処理は停止しません。この機能は、大量のファイルを処理 (削除やコピーなど) する場合に非常に便利です。処理できなかったファイルを知りたいが、エラーが発生した最初のファイルで操作全体を停止させたくありません。

PowerShell には、非終了エラーを終了エラーに「変換」するオプションもあります。

Remove-Item c:\file-doesnt-exist -ErrorAction Stop; "Did I get here"

この場合、実行が停止し、最後に文字列が出力されないことに注意してください。なしで試してみると-ErrorAction Stop、エラーが表示されますが、「Did I get here」という文字列も表示されます。

カテゴリ情報を制御したい場合は、次のように -Category パラメータを使用できます。

PS> write-error "foo" -Category 'InvalidResult'
write-error "foo" -Category 'InvalidResult' : foo
    + CategoryInfo          : InvalidResult: (:) [Write-Error], WriteErrorExce..
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

しかし、WriteErrorException は、このコマンドレットがエラーを発生させるメカニズム (だと思います) です。パラメータがありExceptionますが、それを使用するのはあまりうまくいきませんでした。

于 2011-03-11T00:10:25.367 に答える
3

そのコマンドレットから期待される出力が表示されていると思います。「アクセスが拒否されました」と入力しています。引数であり、それをホストに出力し、設計どおりにエラー ストリームに出力する可能性が最も高いです。$Error 変数に出力されていることを確認でき、挿入したばかりのエラーが入力されているはずです。

すなわち

PS C:\> $error.Clear()

PS C:\> Write-Error "access denied"

Write-Error "access denied" : access denied

    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

PS C:\> $error

Write-Error "access denied" : access denied

    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

おそらく、MSFT はエラーの例を「Access Denied」から「Foobar」に変更してわかりやすくする必要があります。

さらなる質問に対処するために編集: Write-Error のデフォルトの errorAction は「continue」であるため、Write-Warning のように動作させるには、-ErrorAction SilentlyContinue を追加する必要があります。次の例を検討してください。

PS E:\> $error.clear()
PS E:\> Write-Error 'test'
Write-Error 'test' : test
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

PS E:\> Write-Error 'test2' -ErrorAction silentlycontinue  

PS E:\> $error[1]
Write-Error 'test' : test
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

PS E:\> $error[0]
Write-Error 'test2' -ErrorAction silentlycontinue : test2
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
于 2011-03-10T21:42:43.800 に答える