2016-05-23 3 views
1

ある時点でファイルを削除する(または既存のファイルを上書きする)バッチファイルがあります。私はこのような標準的な方法でこれをで行います読み取り専用ファイルの削除(または上書き)が "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.のメッセージを強制的にリダイレクトする方法はありますか?

+0

「解決済み」と言うタイトルを使用しないでください。代わりに、答えを受け入れる(あなたがすでに行った)。 – fedorqui

答えて

4

の代わりに>nul 2>&1を使用してください。 2>&1と言ったら、デフォルト出力に出力しないでください。エラー出力をデフォルト出力のコピーにリダイレクトさせます。しかし、これは左から右に解釈されるので、最初にエラー出力をデフォルト出力のコピーにリダイレクトして画面に表示し、の出力のみをnulにリダイレクトします。

+0

はい!もちろん、私はそれを知っていて、どうやってそれらを後ろに持ってきて、トラブルシューティングの際にそれを逃したのか分からない... Nevermind =) –

関連する問題