web-dev-qa-db-ja.com

Write-Errorを使用してPowershellでエラーストリームに書き込む

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.
13
M. Dudley

書き込み警告と同様の出力を取得するには、次のようにします。

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

(この答えのためのクリスシアーズへの小道具)

16
Neil

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

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

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

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

Catogory情報を制御する場合は、次のように-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パラメータがありますが、それを使用することはあまりできませんでした。

6
Keith Hill

そのコマンドレットから期待される出力が表示されていると思います。 「アクセスが拒否されました」と入力しています。引数とそれをホストに出力し、設計どおりにエラーストリームに出力する可能性があります。 $ 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は、わかりやすくするために、エラーの例を「AccessDenied」から「Foobar」のようなものに変更する必要があります。

さらなる質問に対処するために編集:Write-ErrorのデフォルトのerrorActionは "continue"であるため、Write-Warningのように動作させるには、-ErrorActionSilentlyContinueを追加する必要があります。次の例を考えてみましょう。

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
3
Toby Meyer