Batch-Skript löschen sich selbst
Ich habe eine .bat
Skript startet eine java
Programm.
Die java
Programm löscht den Ordner, wo die .bat
sitzt.
Ich habe keine Möglichkeit, zu berühren, der java
Programm. Ich kann nur ändern, die .bat
Datei.
Das problem ist, dass die .bat
Datei, sobald Sie gelöscht werden, Stoppt seine Ausführung sofort ohne Abschluss.
Aber es gibt einige cleanup-Aufgaben gemacht werden, nachdem die java
Programm beendet.
Ich versuchte, kopieren Sie den .bat
Datei irgendwo anders hin und starten Sie in einem Ort, wo es nicht gelöscht werden. Ach, sobald die original - .bat
gelöscht wird, da es noch in der Ausführung, der gleiche Absturz passiert, und es nicht fertig stellen.
Hier sind zwei Beispiel-Dateien (für den Zweck des Beispiels, lassen Sie uns so tun, als würden Sie sich in D:\tmp
) :
löschen.bat
echo "delete start"
pause
del launch.bat
pause
echo "delete end"
starten.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"
Starten launch.bat
funktionieren würde, wenn die Ausführung der kopiert launch.bat
waren, getrennt von der ersten.
Kennt jemand einen Weg, um eine .bat
am Ende seiner Ausführung, auch wenn es gelöscht wird, während es ausgeführt wird?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diesem Befehl wird das Skript zu löschen, sich dann selbst beenden. Die gesamte Zeile wird gelesen von der Kommando-interpreter, bevor die Zeile ausgeführt wird, so dass der exit-Befehl wird ausgeführt, nachdem der Befehl löschen, obwohl die Datei nicht mehr vorhanden ist.
Alternativ können Sie Klammern verwenden, wenn Sie möchten, dass zu viele Befehle ausführen, nachdem die Datei gelöscht wurde, da der Kommando-interpreter gelesen wird alles, was innerhalb der Klammern vor der Ausführung.
Ich glaube nicht, dass es möglich ist. Batch-Ausführung direkt aus der Datei. Wenn Sie die Datei ändern, es wird sich ändern, die Ausführung (self-modifying batch-Programme sind wunderbar schwierig zu Debuggen!)
Warum gehst du nicht einfach starten Sie Ihre batch-Datei von einem anderen Speicherort?
Selbst wenn Sie nicht tun können, was Sie tun können, ist zu haben eine Datei, die aus nur einer einzigen Zeile, ruft eine andere batch-Datei, die nicht gelöscht werden können. Diese Datei ist alles - starten Sie das java-Programm, all das zu bereinigen, und sogar einschließlich der Wiederherstellung der ursprünglichen batch-Datei, so dass Sie können führen Sie es mehrmals.
echo "launch end"
.Statt ausführen starten.bat über eine
cmd /c launch.bat
, die versuchen, übertragen Sie die Kontrolle wieder an den aufrufenden batch-Datei, wenn es fertig ist, starten Sie es, indem Sie einfach tun:launch.bat
Dieser transfer control (betrachten Sie es als eine goto-statt eines Anrufs) zu der batch-Datei, er wird also nicht versuchen, die Steuerung wieder zu einer Datei, die nicht mehr existiert.
cmd /c
nachdem ich erlebt, dass der Aufruf direkt starten.Fledermaus verursacht das gleiche problem.cmd /k
ist etwas besser, da kann ich sehen, das echo "löschen Ende", aber ich kann immer noch nicht erreichen "Start-Ende".Es scheint, ich habe ein besseres Ergebnis, indem Sie es wie folgt aus (Aufruf
launch.bat
mitcmd /k
) :starten.bat
Nun kann ich erreichen, die
echo "after delete"
, aber ich am Ende irgendwie in einer Endlosschleife. Zumindest meine clean-up ausgeführt werden können an dieser Stelle. Weiß nicht, warum ich nicht erreichen kannecho "launch end"
, obwohl.Es ist möglich, ausführen von Zeilen aus einer Datei gelöscht, aber die Linien müssen sich in einer Klammer zu blockieren, die als Blöcke sind immer auf der Cache komplett in den Speicher, bevor Sie ausgeführt werden.
Natürlich können Sie keine Funktionen aufrufen, die in der batch, es ist jedoch möglich, rufen andere batch-Dateien und erhalten Sie die Kontrolle zurück (in den block).