it-swarm-eu.dev

Come si fa a cancellare un file batch?

È possibile fare un file batch cancellarsi da solo?

Ho provato a farlo eseguire un altro file per eliminarlo ma questo non ha funzionato nessuno sa come potrei farlo. Il file batch che sto usando è elevato. Il mio sistema operativo è Windows 7 a 32 bit.

31
09stephenb

la risposta di npocmaka funziona, ma genera il seguente messaggio di errore: "Il file batch non può essere trovato." Questo non è un problema se la finestra della console si chiude quando termina lo script, come il messaggio lampeggierà così velocemente, nessuno lo vedrà. Ma è molto indesiderabile se la console rimane aperta dopo la fine dello script.

Il trucco per eliminare il file senza un messaggio di errore è quello di ottenere un altro processo nascosto per eliminare il file dopo che lo script termina. Questo può essere fatto facilmente usando START/B per avviare un processo di cancellazione. Ci vuole del tempo per l'avvio e l'esecuzione del processo di cancellazione, quindi lo script genitore ha la possibilità di terminare in modo pulito prima che avvenga l'eliminazione.

start /b "" cmd /c del "%~f0"&exit /b

Puoi semplicemente usare una subroutine CALL se sei preoccupato che SHIFT cessi il valore %0.

call :deleteSelf&exit /b
:deleteSelf
start /b "" cmd /c del "%~f0"&exit /b

Aggiornamento 2015-07-16

Ho scoperto un altro modo davvero intelligente per fare in modo che uno script batch si cancelli senza generare alcun messaggio di errore. La tecnica dipende da un comportamento appena scoperto di GOTO (scoperto da alcuni russi), descritto in inglese all'indirizzo http://www.dostips.com/forum/viewtopic.php?f=3&t=6491

In sintesi, (GOTO) 2>NUL si comporta come EXIT /B, tranne che consente l'esecuzione di comandi concatenati nel contesto del chiamante!

Quindi tutto ciò che serve è

(goto) 2>nul & del "%~f0"
59
dbenham
( del /q /f "%~f0" >nul 2>&1 & exit /b 0  )

Imposta questo alla fine della sceneggiatura. (potrebbe non funzionare se si utilizza il comando SHIFT)

7
npocmaka
del "%~f0"

funzionerà, ma c'è un messaggio di errore se lo chiami da una console precedentemente aperta (tuttavia può essere ignorata).

5
JeffRSon
del %0

Come l'ultima riga del file è il modo più semplice che ho trovato. %0 restituisce il nome del file .cmd attualmente in esecuzione. 

Quando l'ho provato, ho pensato di ottenere un errore "file in uso", ma finora non è successo.

2
archer

Come risposta a questa domanda , (che viene messa in attesa) questo batch si autodistruggerà dopo tre esecuzioni. Il codice per raggiungere questo è condensato nelle ultime 3 righe. Incorpora la punta sopra di 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

Il batch si modifica aggiungendo un token dopo ogni esecuzione e contando le occorrenze del token. Se il numero è raggiunto, si cancella da solo.

> 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

Puoi usare del (name) se sul desktop altrimenti usi del (path to file ex. del C:\WINDOWS.

P.S Non esegue il messaggio di errore

0
ThE WAtChEr

del% 0 come ultima riga del file batch

0
Sam

puoi impostare il ritardo per evitare condizioni di gara, ecco 15 secondi:

START /B CMD.EXE /D /C "PING.EXE -n 15 127.0.0.1 && DEL prova.bat"

GLI APPUNTI

  • CMD.EXE/D è obbligatorio per evitare l'esecuzione di crap-ware con esecuzione automatica
  • PING e DEL devono essere eseguiti syncronus, quindi circondati da virgolette
  • Ho lasciato agli utenti come passare il nome del batch usando "% ~ f0"
0
Massimo