Batch-Skript zu löschen selbst
-
10-07-2019 - |
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?
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