web-dev-qa-db-ja.com

PowerShell:エラーがスクリプトに表示されないようにするにはどうすればよいですか?

たとえば、PowerShellスクリプトが、存在しないサーバー(この場合は「bla」)のSQL Serverオブジェクトを作成しようとすると、PowerShellで多くのPowerShellエラーが赤で表示されます。

私のスクリプトは、そのような呼び出しの後に$?の値をチェックし、エラーを表示してログに記録するので、PowerShellエラーの数行も表示されないようにします。

スクリプトに表示されているものを無効にするにはどうすればよいですか?

72
Andrew J. Brehm

いくつかのオプションがあります。最も簡単なのは、ErrorAction設定を使用することです。

-Erroractionは、すべてのコマンドレットの汎用パラメーターです。無視したい特別なコマンドがある場合は、-erroraction 'silentlycontinue'を使用できます。これは、基本的にそのコマンドによって生成されたすべてのエラーメッセージを無視します。 Ignore値を使用することもできます(PowerShell 3以降):

SilentlyContinueとは異なり、Ignoreはエラーメッセージを$ Error自動変数に追加しません。

スクリプト内のすべてのエラーを無視する場合は、システム変数$ErrorActionPreferenceを使用して、同じことを実行できます:$ErrorActionPreference= 'silentlycontinue'

-ErrorActionの詳細については、 about_CommonParameters を参照してください。 $ ErrorActionPreferenceの詳細については、 about_preference_variables を参照してください。

108
JNK

Windows PowerShellには、エラーを報告するための2つのメカニズムがあります。1つは終了エラー、もう1つは終了しないエラーです。

内部CmdLetsコードは、コマンドレットによる入力オブジェクトの処理の継続を許可しない、または許可しないエラーが発生したときに、ThrowTerminatingErrorメソッドを呼び出すことができます。スクリプト作成者は、例外を使用してこれらのエラーをキャッチできます。

例:

try
{
  Your database code
}
catch
{
  Error reporting/logging
}

コマンドレットが入力オブジェクトの処理を続行できる場合、内部CmdLetsコードはWriteErrorメソッドを呼び出して、終了しないエラーを報告できます。スクリプト作成者は、-ErrorActionオプションを使用してメッセージを非表示にするか、$ErrorActionPreferenceを使用してスクリプト全体の動作を設定できます。

15
JPBlanc

[system.net.dns]を使用してホスト名を解決しようとすると、同様の問題が発生しました。 IPが解決されなかった場合、.Netは終了エラーをスローしました。終了エラーを防ぎ、出力の制御を保持するために、TRAPを使用して関数を作成しました。

例えば。

Function Get-IP 
{PARAM   ([string]$HostName="")
PROCESS {TRAP 
             {"" ;continue} 
             [system.net.dns]::gethostaddresses($HostName)
        }
}
6
D-W

あなたはここから外れています。

既に素敵で大きなエラーメッセージが表示されています。一体なぜ、すべての単一コマンドの後に$?を明示的にチェックするコードを書きたいのでしょうか?これは非常に面倒でエラーが発生しやすくなります。正しい解決策は、$?のチェックを停止することです。

代わりに、PowerShellのビルトインメカニズムを使用して爆破します。 error preference を最高レベルに設定することで有効にします:

$ErrorActionPreference = 'Stop'

これをこれまでに作成したすべてのスクリプトの先頭に配置しましたが、今では$?を確認する必要はありません。これにより、コードが大幅に単純化され、信頼性が高まります。

本当にこの動作を無効にする必要がある状況に陥った場合、 catch エラーを発生させるか、共通を使用して特定の関数に設定を渡すことができます -ErrorAction 。あなたの場合、おそらく最初のエラーでプロセスを停止し、エラーをキャッチしてからログに記録したいでしょう。

これは外部実行可能ファイルが失敗した場合(通常は終了コードがゼロ以外)を処理しないため、呼び出した場合は$LASTEXITCODEをチェックする必要があることに注意してください。この制限にもかかわらず、この設定は多くのコードと労力を節約します。

追加の信頼性

strict mode の使用を検討することもできます。

Set-StrictMode -Version Latest

これにより、存在しない変数を使用したり、その他の奇妙な状況でPowerShellが静かに進むのを防ぎます。 (制限対象の詳細については、-Versionパラメーターを参照してください。)

これらの2つの設定を組み合わせることで、PowerShellはフェイルファスト言語になり、プログラミングが非常に簡単になります。

2
jpmc26

-ErrorAction SilentlyContinueをスクリプトに追加すると、準備完了です。

0
Jayant Rajwani