30

いくつかの SVN タスクを自動化する PowerShell スクリプトには、次の機能があります。

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

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

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

残念ながら、これは私のスクリプトの出力をひどく台無しにします。

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

4

5 に答える 5

31

標準エラーのみを抑制したい場合は、次を使用します。

svn info $url 2>$null
于 2016-07-28T15:18:51.793 に答える
30

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

これに対して何時間も額を叩いてきた後、もちろん、ここに質問を投稿してから数分以内に解決策を見つけました。

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

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

于 2012-08-15T12:57:44.967 に答える
6

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

svn info $url *> $null

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

about_Redirection

于 2014-06-20T16:35:00.307 に答える
5

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 の回答では、すべての出力ストリームを便利な代替手段として*>$null抑制することを提案しています。Out-Null$null = ...

ただし、質問のコードには別の問題があります。

特定のコマンドで動作する可能性がありますが$?、残念ながら、外部プログラムが成功したかどうかの堅牢な指標ではありません。代わりに使用してください。$LASTEXITCODE -eq 0ここで-であっても$?反射してしまう可能性があります(明確に成功を通知します)。$false$LASTEXITCODE0

  • 更新: v7.2 より前の実験的機能という名前PSNotApplyErrorActionToStderrが正式な機能になった場合、この問題は解消されます。詳細については、この回答を参照してください。

あなたの質問で試したことについて:

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

  • パイプライン全体ではなく、パイプライン内の個々の2>&1コマンドに作用するなどのリダイレクト

  • したがって、stderr出力をsvn info $url生成すると、ホスト(コンソール)に直接出力されますが、表示されることはありません。Out-Null

于 2019-09-11T15:04:14.743 に答える