8

長いビルドを実行するためのバッチ ファイルがあり、最後に EXE を作成するとします。ビルドを開始する前にアプリを閉じるのを忘れると、EXE を再作成できず、リンク フェーズが失敗します。

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

%ErrorLevel% をゼロ以外の値に設定する開いているファイルをチェックする非破壊的な方法は何ですか?

4

3 に答える 3

9

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

ただし、この方法は機能しました。

COPY /B app.exe+NUL app.exe

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

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

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

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

エラーメッセージは保存されます (そのようなメッセージは通常、いわゆる標準エラーデバイスに送信され、>NULリダイレクトによって破棄されませんが、エラー以外のメッセージは通常、標準出力に送信されるため、 で抑制することができます>NUL) 。スクリプトの早期終了の説明として役立ちます。ただし、代わりに独自のメッセージを表示したい場合は、次のようにすることができます。

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

>NUL標準出力に送信されるものは何でも非表示にし2>NULますが、標準エラーに対しても同じことを行います。

于 2011-08-07T01:25:32.607 に答える
2

より良い方法を見つけました:

:start
timeout /T 5

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


:ende
YourCode

これは、5 秒ごとに「ファイルが使用中か」をチェックし、再起動するかどうかを確認します。そうでない場合は、次のオプションを実行できる場所になります

于 2016-02-29T09:11:18.573 に答える
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

ファイルの名前を同じ名前に変更します。可能であれば、スクリプトはコードを終了する end にジャンプします。それ以外の場合は、エラー コード 1 を生成して errorline にジャンプします。5 秒のタイムアウトの後、:start にジャンプし、スクリプトを最初から開始します。

于 2014-06-25T08:14:21.610 に答える