2011-08-06 22 views
6

長いビルドを実行するためのバッチファイルがあり、最後にEXEファイルが作成されているとします。私がビルドを開始する前にアプリケーションを終了するのを忘れた場合、リンクフェーズはEXEを再作成できないときに失敗します。ファイルがバッチファイルで開いているかどうかを検出する

ビルドの開始でEXEが開いているかどうかを確認したいと思います。私はEXEファイル自体の名前を変更しようとしましたが、アクセス拒否エラーが発生しましたが、内部コマンドであるrenameコマンドは%ErrorLevel%を設定しません。

%ErrorLevel%をゼロ以外の値に設定するオープンファイルをチェックする非破壊的方法とは何ですか?

答えて

6

私の名前変更方法は機能しませんでした(Windows XP SP3でテスト済み)。私は任意のアプリケーションを起動し、それ自身に名前を変更しようとしました。エラーはなく、何の効果もありませんでした。

しかし、この方法では、仕事をした:

COPY /B app.exe+NUL app.exe 

アプリケーションが実行されていた、このコマンドは私にエラーメッセージを生成します。また、アプリケーションがロックされていない場合、このコマンドだけではファイルの内容は保持されませんでしたが、変更タイムスタンプは変更されませんでした。

私があなただったら(あなたが言ったように、バッチスクリプトの先頭で)、それゆえ、私はおそらくこのように、このコマンドを使用します。

COPY /B app.exe+NUL app.exe >NUL || (GOTO :EOF) 

||オペレータは、コマンドに制御を渡します。前のコマンドが失敗した場合(エラーレベル値を上げた場合)、その隣の/ブロックしたがって、上記のコマンドは、COPYが失敗した場合にスクリプトを終了します(ファイルが開いていた場合)。

エラーメッセージは通常、いわゆる標準エラーデバイスに送信され、>NULリダイレクトで破棄されないため、通常は標準出力に送信されるため、エラーメッセージは保存されます。 >NULで抑制する)、スクリプトの早すぎる終了の説明として役立ちます。 2>NULは、標準エラーのため同じことを、標準出力に送信されているもの

COPY /B app.exe+NUL app.exe >NUL 2>NUL || (ECHO Target file inaccessible& GOTO :EOF) 

>NULながら皮革:あなたの代わりに独自のメッセージを表示したい場合は、このような何かを試すことができます。

+0

ありがとう@Andriy。うん、それは動作します。しかし、関係する実行可能ファイルが大きい場合は、少し時間がかかりますが、それは私のものです。私が考えたもう一つの方法は、ファイルの名前をランダムな名前に変更しようとする2行のdelphiユーティリティを作成し、成功した場合はそれを再度名前を変更し、できなかった場合はゼロ終了コードを返します。 – rossmcm

1
@echo off 

:start 
ren filename filename  // rename file to same name 
if errorlevel 1 goto errorline 
echo command successfull file is not in use anymore 
goto end 
:errorline 
echo Rename wasnt possible, file is in use try again in 5seconds 
timeout /T 5 
goto :start 
:end 
exit 

スクリプトは、whichsコードを終了終了それがエラーCODE1を生成し、errorlineへジャンプotherwizeにジャンプし、可能な場合、5秒のタイムアウト後、それがためにジャンプし、同じ名前のファイルの名前を変更:起動スクリプトが起動します初めから。

+0

これは何を説明しますか?どのように呼び出すか、それを使う?それを英語に翻訳できますか? – Abel

1

良い方法が見つかりました:

:start 
timeout /T 5 

if exist %1 (
2>nul (
    >> %1 (call) 
) && (goto ende) || (goto start)) else (exit) 


:ende 
YourCode 

をこれは、その、それが再び開始される場合は、「使用中のファイルである」のための5秒後に、すべてをチェックします。そうでない場合は、次のオプションを行うことができる場所に行きます。

関連する問題