質問

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top