it-swarm.com.de

Wie kann man eine Batch-Datei selbst löschen lassen?

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.

31
09stephenb

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"
67
dbenham
( 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.)

7
npocmaka
del "%~f0"

funktioniert, aber es wird eine Fehlermeldung angezeigt, wenn Sie es von einer zuvor geöffneten Konsole aus aufrufen (kann jedoch ignoriert werden).

5
JeffRSon
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.

2
archer

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
1
LotPings

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

0
ThE WAtChEr

del% 0 als letzte Zeile der Batchdatei

0
Sam

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

  • CMD.EXE/D ist obligatorisch, um die Ausführung von Craps, die automatisch ausgeführt werden, zu vermeiden
  • PING und DEL müssen synchron ausgeführt werden, also von Anführungszeichen umgeben
  • Ich lasse den Benutzern zu, wie der Stapelname mit "% ~ f0" übergeben wird.
0
Massimo