ある時点でファイルを削除する(または既存のファイルを上書きする)バッチファイルがあります。私はこのような標準的な方法でこれをで行います読み取り専用ファイルの削除(または上書き)が "STDERR"のリダイレクトに失敗する
c:\>del somefile
このエラーメッセージには、もちろん結果の(ファイルが「読み取り専用」である場合):
Access is denied.
場合にはそのdeleteコマンドが失敗し、削除後にファイルが存在するかどうかをチェックして、削除が成功したかどうかをテストしたい。だから、私は出力(STDOUT
)をリダイレクトするとエラー出力(STDERR
)「NUL」とし、さらにアクションが必要になるかどうかを確認するには、deleteコマンドの後に「if file exists ...
」を使用します。
del somefile 2>&1 >nul
if exists somefile goto :someplace
問題があり、
c:\>del somefile 2>&1 >nul
Access is denied.
c:\>
これは私がバッチファイルまたはコマンドプロンプトからこれを実行していますか起こる:私はまだエラーメッセージが表示されますので、STDERR
のリダイレクトが失敗したことが表示されます。
私は私はこのような削除を強制(およびエラーメッセージを回避)するdel
ため/F
(強制)スイッチを使用することができます理解:
c:\>del /F somefile 2>&1 >nul
c:\>
しかし、私は事情を知っていると取る能力を失います必要に応じて他のアクション(ユーザーにプロンプトを出すなど)また、deleteコマンドが他の理由(ファイルが使用中のようなもの)で失敗する(まれに)可能性があります。この場合、おそらくSTDERR
のリダイレクトが失敗することがあります。
この問題を回避するには、ファイルの「読み取り専用」の状態を調べるために、(delete
コマンドの前に)attrib
コマンドを使用することですが、これは少し複雑になり、そしておそらく最高の外部コマンドで「REGEX
」を使用して行われます「grep
」または「sed
」(まだまだ実行可能)のようになります。
「cmd.exe
」のこの動作は知られていますが、「バグ」とはみなされない何らかの理由がありますか?
"cmd.exe
"にこのAccess is denied.
のメッセージを強制的にリダイレクトする方法はありますか?
「解決済み」と言うタイトルを使用しないでください。代わりに、答えを受け入れる(あなたがすでに行った)。 – fedorqui