2017-03-24 16 views
0

Windows 7 64ビットバッチファイルのエラーレベルをテストしても予期しない結果が返されない

ディレクトリから別のディレクトリにファイルをコピーしてからファイルを削除するバッチファイルを作成しています。バッチファイルが実行されたときに、コピーしようとしているファイルが別のプログラムによって書き込まれているときに、「別のプロセスによって使用されているため、プロセスがファイルにアクセスできません」というエラーが発生することがあります。私は、この状態でエラーレベルテストを行うことができることを期待していました。それが存在する場合、遅延にジャンプして再試行します。 IF ERRORLEVEL 1タイプのテストを私に与えることができません1条件を私は私の遅延にジャンプすることができます。私はerrorlevelの周りの%を使っていろいろな種類のバリエーションを試しました。私は、 "プロセスがファイルにアクセスできません..."というエラーを出すのを知っていても、非0の結果を出すようには見えません。私はこれが一度に働いたことを誓っていますが、なぜ私はそれがもはや働いていない理由を理解することができません。私は以下のはるかに単純なテストを試みても、それはゼロでないエラーレベルとして失敗した削除コマンドを表示しません。失敗した削除コマンドを受け取り、私が遅延にジャンプできるようにする適切なエラーレベルテストをどのように構築するのですか?

:start 
copy c:\users\pc\documents\recordings\*.mp3 c:\recordings 
del c:\users\pc\documents\recordings\*.mp3 
if errorlevel 1 goto delay 
goto start 
:delay 
echo delay 
ping 1.1.1.1 > nul 
goto start 

答えて

0

まあ、私はこのやり方でやや異なった方法で来ることができました。周りを検索した後、基本的に私がしたいコードを見つけました。これを私のはるかに大きなスクリプトに統合した後、私は遅れて飛び降りて、ファイルがロックされなくなるまで再試行することができます。

@echo off 
2>nul (
>>test.txt echo off 
) && (echo file is not locked) || (echo file is locked) 

なぜ私はerrorlevelが働くのをチェックできなかったのかと戸惑っています。私はこれまでにこの作業をしていたことを誓っていますが、それを再び働かせることはできませんでした。私はたくさんの検索をしてきましたが、実際に決定的な答えを思いついたわけではありません。エラーレベルのチェックは、うまくいけばずっと簡単でした。

---更新---

私が探しに行って、FINDSTRコマンドを発見し、いくつかのコードで遊んでは別の方法である何かを思い付きました。私は「アクセスが拒否されました」という別のエラーメッセージを表示する読み取り専用属性を使用してファイルを「ロック」していますが、findstrを使用してtmpにパイプされたエラーコードを検索しています。そうではない、別のものをする。仕事をしているようだ。私はこれを私のコードに統合して、それがどのように動作するかを見ることができます。

@echo off 
cls 
:start 
del c:\recording.mp3 2> tmp > nul 
findstr "Access" tmp > nul 
if %ERRORLEVEL% EQU 0 GOTO delay 
ECHO NO DELAY 
ping 1.1.1.1 > nul 
goto start 
:delay 
echo DELAY 
ping 1.1.1.1 -n 1 > nul 
goto start 
関連する問題