一部のSVNタスクを自動化するPowerShellスクリプトには、次の関数があります。
function SvnUrlExists($url)
{
svn info $url | out-null 2>&1
return $?
}
これは、SVNリポジトリのURLが存在するかどうかを明示的にテストするため、エラー出力にはまったく関心がありません。ただし、PowerShellでstderr
をリダイレクトすることについて私が見つけたすべてにもかかわらず、2>&1
をstdout
にリダイレクトするにはこれでもエラーメッセージが出力されます:
svn:警告:W170000:URL 'blahblah'はリビジョン26762に存在しません svn:E200009:一部のターゲットが存在しないため、すべてのターゲットの情報を表示できませんでした
残念ながら、これは私のスクリプトの出力をひどく混乱させます。
私は何を間違っているのですか、このエラー出力をどのように抑制すべきですか?
他の誰かが私と同じような用語をググった場合に備えて:
額にこれを何時間もぶつけた後、もちろんここに質問を投稿してから数分以内に解決策が見つかりました:
svn info $url 2>&1 | out-null
これは魅力のように機能します。
only標準エラーを抑制したい場合は、以下を使用します。
svn info $url 2>$null
投票した答えがエラーになります。解決策は次のようになりました:
cmd /c "MyProgram MyArguments 2>&1" | Out-Null
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
であっても、$LASTEXITCODE
は0
を反映する可能性があります(不明確に成功を通知する)。
あなたが質問したことについて:
svn info $url | out-null 2>&1 # WRONG