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


92

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

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

スクリプトに表示されているものを非アクティブにするにはどうすればよいですか?

回答:


132

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

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

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

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

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


-erroraction 'silentlycontinue'に単一引用符が必要ですか?Intelliseseはオプションを表示しており、単一引用符を追加していません。
PAS

1
上記のフォーマットが機能しない場合は、上記のリンクを参照してください。-ErrorAction:SilentlyContinuePS 5.1のようにフォーマットする必要がありました。私はコマンドレットをバッチから呼び出していたので、それが違いをもたらすかどうかはわかりません。ただし、許容可能なエラーがスローされる可能性があることがわかっている場合は、適切な情報が得られます。
David

--rm。\ Windows.old \ -Force -Recurse -Verbose -ErrorAction SilentlyContinue -WarningAction SilentlyContinue </ code>
Tertius Geldenhuys

18

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

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

EX:

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

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


8

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

例えば

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

3

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

あなたはすでに素晴らしい大きなエラーメッセージを持っています。なぜ地球上で$?すべてのコマンドの後で明示的にチェックするコードを書きたいのですか?これは非常に扱いにくく、エラーが発生しやすくなります。正しい解決策は、チェックを停止すること$?です。

代わりに、PowerShellの組み込みメカニズムを使用して爆破します。これを有効にするには、エラー設定を最高レベルに設定します

$ErrorActionPreference = 'Stop'

私はこれをこれまでに書いたすべてのスクリプトの一番上に置き、今では確認する必要はありません$?。これにより、コードが大幅にシンプルになり、信頼性が高まります。

あなたが状況に遭遇した場合は、実際にこの動作を無効にする必要があり、どちらかの可能catchエラーまたは共通を使用して、特定の機能に設定を渡します-ErrorAction。あなたのケースでは、最初のエラーでプロセスを停止し、エラーをキャッチしてログに記録したいと思うでしょう。

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

追加の信頼性

strictモードの使用も検討してください

Set-StrictMode -Version Latest

これにより、存在しない変数を使用した場合やその他の奇妙な状況で、PowerShellが警告なしに処理されるのを防ぎます。(-Version制限の詳細については、パラメーターを参照してください。)

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



2

場合によっては、コマンドの後にOut-Nullをパイプすることができます

command | Out-Null

-1

コマンドレットのpowershellエラーメッセージを抑制したいが、エラーをキャッチしたい場合は、「-erroraction 'silentlyStop'」を使用します。


そのような行動はありません。ただし、Stopアクションがあります。
Marvin Dickhaus、2015

しかし、それは赤いエラーメッセージを抑制し、それでもNew-Item -ItemType directory(PowerShell v2.0)を使用しているときにcatchコマンド/セクションを使用することを可能にします
Milan Kerslager

@MilanKerslagerは、コードサンプルを親切に見せていただけますか-私と他のすべての人は、「SilentlyStop」のようなActionPreferenceがないと信じています
FSCKur

Mikkelは、silentlyStopではなくSilentlyContinueを意味していたと私は合理的に確信しています。
John
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.