web-dev-qa-db-ja.com

PowerShellで標準エラー出力を抑制するにはどうすればよいですか?

一部のSVNタスクを自動化するPowerShellスクリプトには、次の関数があります。

function SvnUrlExists($url)
{
  svn info $url | out-null 2>&1
  return $?
}

これは、SVNリポジトリのURLが存在するかどうかを明示的にテストするため、エラー出力にはまったく関心がありません。ただし、PowerShellでstderrをリダイレクトすることについて私が見つけたすべてにもかかわらず、2>&1stdoutにリダイレクトするにはこれでもエラーメッセージが出力されます

 svn:警告:W170000:URL 'blahblah'はリビジョン26762に存在しません
 svn:E200009:一部のターゲットが存在しないため、すべてのターゲットの情報を表示できませんでした

残念ながら、これは私のスクリプトの出力をひどく混乱させます。

私は何を間違っているのですか、このエラー出力をどのように抑制すべきですか?

19
sbi

他の誰かが私と同じような用語をググった場合に備えて:

額にこれを何時間もぶつけた後、もちろんここに質問を投稿してから数分以内に解決策が見つかりました:

svn info $url 2>&1 | out-null

これは魅力のように機能します。

18
sbi

only標準エラーを抑制したい場合は、以下を使用します。

svn info $url 2>$null
15
Daniel

これを行うこともできます:

svn info $url *> $null

PowerShellでのコンソール出力の抑制を参照してください

about_Redirection

3
Steven Penny

投票した答えがエラーになります。解決策は次のようになりました:

cmd /c "MyProgram MyArguments 2>&1" | Out-Null
3
David Bertrand

tl; dr

function SvnUrlExists($url)
{

  # Suppress all output streams (external stdout and stderr in this case)
  # To suppress stderr output only, use 2>$null
  svn info $url *>$null 

  # For predictable results with external programs, 
  # infer success from the *process exit code*, not from the automatic $? variable.
  # See https://github.com/PowerShell/PowerShell/issues/10512
  $LASTEXITCODE -eq 0
}

自分の答え は、リダイレクトの問題に効果的に対処します。

Steven Penny's answer*>$nullを提案します。つまり、便利な代替手段としてall出力ストリームを抑制します-Out-Nullの必要性を取り除きます。 with $null = ...- this answer を参照してください。

しかし、あなたの質問のコードには別の問題があります:

特定のコマンドで機能する場合がありますが、$?は残念ながらnot外部プログラムが成功したかどうかを示す強​​力なインジケータです-代わりに$LASTEXITCODE -eq 0を使用します。これは、PowerShell Core 7.0.0-preview.3以降のバグが原因です。 GitHubで報告 ここ -$?$falseであっても、$LASTEXITCODE0を反映する可能性があります(不明確に成功を通知する)。


あなたが質問したことについて:

svn info $url | out-null 2>&1  # WRONG
  • success出力のみがパイプラインに送信されます(stdout外部プログラムからの出力はPowerShellの成功出力 stream に送信されます)。

  • リダイレクト2>&1などのアクション個別パイプラインではなく、パイプラインのコマンド全体として

  • したがって、svn info $urlstderr出力を生成する場合、それはHost(コンソール)に直接出力されます-Out-Nullはそれを見ることはありません。

1
mklement0