Frage

Ich habe einen .bat Skript ein java Programm zu starten. Das java Programm löscht den Ordner, in dem der .bat sitzt. Ich habe keine Möglichkeit, das java Programm zu berühren. Ich kann nur die .bat Datei ändern.

Das Problem ist, dass die .bat Datei einmal gelöscht, stoppt seine Ausführung sofort ohne Nachbearbeitung. Aber es gibt einige Bereinigungsaufgaben nach dem java Programm beendet getan werden.

Ich habe versucht, die .bat Datei irgendwo anders und starten Sie es an einem Ort zu kopieren, wo sie nicht gelöscht werden würde. Ach, wenn der ursprüngliche .bat gelöscht wird, weil es immer noch in der Ausführung ist, geschieht der gleiche Absturz und es nicht beenden.

Hier sind zwei Beispieldateien (zum Zwecke des Beispiels wollen wir so tun, als sie in D:\tmp befinden):

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 starten würde funktionieren, wenn die Ausführung des kopierten launch.bat von der anfänglichen getrennt wurden.

Kennt jemand eine Möglichkeit, einen .bat zu machen seine Ausführung am Ende, auch wenn es gelöscht wird, während es ausgeführt wird?

War es hilfreich?

Lösung 4

Es scheint, ich habe ein besseres Ergebnis, indem sie es so (Aufruf launch.bat mit cmd /k) tun:

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"

Jetzt kann ich die echo "after delete" erreichen, aber ich am Ende irgendwie in einer Endlosschleife. Wenigstens kann meine aufzuräumen an dieser Stelle ausgeführt werden. Sie wissen nicht, warum ich nicht echo "launch end" erreichen kann, though.

Andere Tipps

Damit wird die Script-Befehl selbst Ausfahrt dann zu löschen. Die gesamte Linie wird durch den Befehlsinterpreter zu lesen, bevor die Zeile ausgeführt wird, so wird der Befehl exit auch nach dem Löschbefehl ausgeführt werden, wenn die Datei nicht mehr existiert.

del /f/q "%~0" | exit

Alternativ können Sie Klammern verwenden, wenn Sie viele Befehle ausführen möchten, nachdem die Datei als Kommandointerpreter gelöscht wurde, wird alles in den Klammern lesen, bevor sie ausgeführt wird.

(del /f/q "%~0"
if exist "%~0" (echo.How did that happen?) else (echo.I've deleted myself.)
pause
exit)   
  

Kennt jemand eine Möglichkeit, eine .bat zu machen seine Ausführung am Ende, auch wenn es gelöscht wird, während es ausgeführt wird?

Ich glaube nicht, es ist möglich. Stapelverarbeitung lesen direkt aus der Datei. Wenn Sie die Datei ändern, wird die Ausführung ändern (selbst-modifizierenden Batch-Programme zu debuggen wunderbar schwer!)

Warum Sie nicht nur Ihre Batch-Datei von einem anderen Ort starten?

Auch wenn Sie das nicht tun können, was tun Sie können eine Datei haben, der nur eine einzige Zeile aus, eine andere Batch-Datei aufrufen, die gelöscht nicht bekommen. Diese Datei macht alles -. Starten des Java-Programm, tun alle aufzuräumen und sogar einschließlich der ursprünglichen Batch-Datei wieder herstellt, so dass Sie es mehrmals ausführen können

Statt launch.bat über eine cmd /c launch.bat laufen, die Kontrolle zu übertragen an die anrufende Batch-Datei wird versuchen, zurück, wenn es fertig ist, führen Sie es, indem Sie einfach tun: launch.bat Dies wird die Steuerung übertragen (man denke an sie als goto anstelle eines Call) auf die Batchdatei, so dass er versuchen wird nicht Steuerung in eine Datei zurückzugeben, die nicht mehr vorhanden ist.

Es ist möglich, Zeilen aus einer gelöschten Datei auszuführen, aber die Linien haben in einer Klammer Block wohnen, als Blöcke immer komplett in dem Speicher zwischengespeichert werden, bevor sie ausgeführt werden.

Natürlich kann man nicht Funktionen im Batch nennen, aber es ist möglich, andere Batch-Dateien aufzurufen und die Kontrolle zurück (in den Block).

@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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top