Kann man eine Batch-Datei selbst löschen lassen?
Ich habe versucht, eine andere Datei ausführen zu lassen, um sie zu löschen, aber das hat nicht funktioniert, weiß jemand, wie ich es tun könnte. Die Batchdatei, die ich verwende, ist erhöht. Mein Betriebssystem ist Windows 7 32 Bit.
die Antwort von npocmaka funktioniert, es wird jedoch die folgende Fehlermeldung angezeigt: " Die Batchdatei wurde nicht gefunden. "Dies ist kein Problem, wenn das Konsolenfenster beim Beenden des Skripts geschlossen wird, da die Meldung so schnell blinkt, dass niemand sie sieht. Es ist jedoch sehr unerwünscht, wenn die Konsole nach dem Beenden des Skripts geöffnet bleibt.
Der Trick, um die Datei ohne Fehlermeldung zu löschen, besteht darin, einen anderen versteckten Prozess zum Löschen der Datei zu veranlassen, nachdem das Skript beendet wurde. Dies kann einfach mit START/B geschehen, um einen Löschvorgang zu starten. Es dauert einige Zeit, bis der Löschvorgang gestartet und ausgeführt wird, sodass das übergeordnete Skript ordnungsgemäß beendet werden kann, bevor der Löschvorgang ausgeführt wird.
start /b "" cmd /c del "%~f0"&exit /b
Sie können einfach eine CALLed-Subroutine verwenden, wenn Sie befürchten, dass SHIFT den Wert %0
in den Papierkorb legt.
call :deleteSelf&exit /b
:deleteSelf
start /b "" cmd /c del "%~f0"&exit /b
Update 16.07.2015
Ich habe eine andere wirklich clevere Möglichkeit entdeckt, ein Batch-Skript selbst löschen zu lassen, ohne eine Fehlermeldung zu generieren. Die Technik hängt von einem neu entdeckten Verhalten von GOTO (von einigen Russen entdeckt) ab, das in englischer Sprache unter http://www.dostips.com/forum/viewtopic.php?f=3&t=6491 beschrieben wird
Zusammenfassend verhält sich (GOTO) 2>NUL
wie EXIT /B
, nur dass verkettete Befehle im Kontext des Aufrufers ausgeführt werden können!
Alles was Sie brauchen ist
(goto) 2>nul & del "%~f0"
( del /q /f "%~f0" >nul 2>&1 & exit /b 0 )
Stellen Sie dies am Ende des Skripts ein. (funktioniert möglicherweise nicht, wenn der Befehl SHIFT
verwendet wird.)
del "%~f0"
funktioniert, aber es wird eine Fehlermeldung angezeigt, wenn Sie es von einer zuvor geöffneten Konsole aus aufrufen (kann jedoch ignoriert werden).
del %0
Die letzte Zeile der Datei ist der einfachste Weg, den ich gefunden habe. %0
gibt den Namen der aktuell ausgeführten .cmd
-Datei zurück.
Als ich es zum ersten Mal ausprobierte, dachte ich, ich würde den Fehler "file in use" bekommen, aber das ist bisher noch nicht geschehen.
Als Antwort auf diese Frage (die zurückgestellt wird) wird diese Charge nach drei Durchläufen selbstzerstörend. Der Code, um dies zu erreichen, ist in den letzten 3 Zeilen zusammengefasst. Es enthält den oben genannten Tipp von Dbenham
@Echo off
Rem batch main purpose
Rem
Rem
Set Tok=###&For /f %%C in ('find /C "%Tok%" ^<"%~f0"') Do Set /A Cnt=%%C
Echo Run-%Cnt%&If %Cnt% Geq 3 (goto) 2>nul & del "%~f0"
Echo %Tok%>>"%~f0"& Goto :Eof
Der Stapel ändert sich selbst, indem er nach jedem Lauf ein Token anfügt und die Vorkommen des Token zählt. Wenn die Nummer erreicht ist, löscht sie sich selbst.
> Dir /B Kill*
KillMySelf.cmd
> KillMySelf.cmd
Run-1
> KillMySelf.cmd
Run-2
> KillMySelf.cmd
Run-3
> Dir /B Kill*
File Not Found
Sie können del (name)
verwenden, wenn es auf dem Desktop andernfalls del (path to file ex. del C:\WINDOWS
verwendet wird.
P.S macht keine Fehlermeldung msg
del% 0 als letzte Zeile der Batchdatei
sie können die Verzögerung einstellen, um Rennbedingungen zu vermeiden. Hier sind 15 Sekunden:
START /B CMD.EXE /D /C "PING.EXE -n 15 127.0.0.1 && DEL prova.bat"
ANMERKUNGEN