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.
書き込み警告と同様の出力を取得するには、次のようにします。
$Host.UI.WriteErrorLine("This is an error")
(この答えのためのクリスシアーズへの小道具)
うまくいっていると思いませんか? 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
パラメータがありますが、それを使用することはあまりできませんでした。
そのコマンドレットから期待される出力が表示されていると思います。 「アクセスが拒否されました」と入力しています。引数とそれをホストに出力し、設計どおりにエラーストリームに出力する可能性があります。 $ 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