質問
java
プログラムを起動する .bat
スクリプトがあります。
java
プログラムは、 .bat
が置かれているフォルダーを削除します。
java
プログラムに触れる方法はありません。 .bat
ファイルのみを変更できます。
問題は、削除された .bat
ファイルが、終了せずにすぐに実行を停止することです。
ただし、 java
プログラムの終了後に実行するクリーンアップタスクがいくつかあります。
.bat
ファイルを別の場所にコピーして、削除されない場所で起動しようとしました。残念ながら、元の .bat
が削除されると、まだ実行中であるため、同じクラッシュが発生し、終了しません。
ここに2つのサンプルファイルがあります(例の目的のために、それらが D:\ tmp
にあるふりをしましょう):
delete.bat
echo "delete start"
pause
del launch.bat
pause
echo "delete end"
launch.bat
echo "launch start"
setlocal enabledelayedexpansion enableextensions
if "%CD%"=="C:\tmp" (
echo "in temp"
d:
cd \tmp
delete.bat
)
if "%CD%" NEQ "C:\tmp" (
echo "not in temp"
mkdir C:\tmp
copy launch.bat C:\tmp\launch.bat
echo "launch copied"
C:
cd \tmp
cmd /c launch.bat
)
echo "launch end"
launch.bat
の起動は、コピーされた launch.bat
の実行が最初の実行から分離されていれば機能します。
.bat
が実行中に削除されたとしても、実行されるようにする方法を知っている人はいますか?
解決 4
このようにすることでより良い結果が得られるようです( cmd / k
で launch.bat
を呼び出します):
launch.bat
echo "launch start"
setlocal enabledelayedexpansion enableextensions
if "%CD%"=="C:\tmp" (
echo "in temp"
d:
cd \tmp
delete.bat
echo "after delete"
)
if "%CD%" NEQ "C:\tmp" (
echo "not in temp"
mkdir C:\tmp
copy launch.bat C:\tmp\launch.bat
echo "launch copied"
C:
cd \tmp
cmd /k launch.bat
)
echo "launch end"
今では echo" after delete"
に到達できますが、どういうわけか無限ループに陥ります。少なくとも私のクリーンアップはこの時点で実行できます。ただし、 echo" launch end"
に到達できない理由はわかりません。
他のヒント
これは、スクリプトにそれ自体を削除して終了するように命令します。行が実行される前に行全体がコマンドインタープリタによって読み取られるため、ファイルが存在しなくても、削除コマンドの後に終了コマンドが実行されます。
del /f/q "%~0" | exit
別の方法として、コマンドインタープリターは実行前にかっこ内のすべてを読み取るため、ファイルを削除した後に多くのコマンドを実行する場合は、かっこを使用できます。
(del /f/q "%~0"
if exist "%~0" (echo.How did that happen?) else (echo.I've deleted myself.)
pause
exit)
実行中に.batが削除されても、.batを実行させる方法を知っている人はいますか?
それは可能だとは思わない。ファイルから直接読み取られるバッチ実行。ファイルを変更すると、実行が変更されます(自己変更バッチプログラムのデバッグは非常に困難です!)
別の場所からバッチファイルを開始するだけではどうですか?
それができなくても、できることは、削除されない別のバッチファイルを呼び出して、1行だけで構成されるファイルを作成することです。このファイルはすべてを実行します-Javaプログラムの起動、すべてのクリーンアップの実行、さらに元のバッチファイルの復元を含めて、複数回実行できるようにします。
cmd / c launch.bat
を介してlaunch.batを実行する代わりに、完了時に呼び出し元のバッチファイルに制御を戻そうとするので、単にを実行して実行します。 launch.bat
これは、制御を(呼び出しではなくgotoと考えて)バッチファイルに転送するため、存在しないファイルに制御を戻そうとしません。
削除されたファイルから行を実行することは可能ですが、実行前にブロックは常にメモリに完全にキャッシュされるため、行は括弧ブロック内に存在する必要があります。
明らかに、バッチ内で関数を呼び出すことはできませんが、他のバッチファイルを呼び出して、コントロールを(ブロック内に)戻すことができます。
@echo off
(
echo Delete myself
del %~f0
call ..\second.bat
echo do some other stuff after second.bat
)
echo This line can't be reached anymore