2010-05-22 10 views
25

Come rendere il file .BAT cancellarlo dopo il completamento? Ho un semplice file bat che termina un processo. Voglio quel file .BAT per cancellarsi.Come rendere il file .BAT cancellarlo dopo il completamento?

+6

Così si desidera un file batch che non mostra alcuna finestra, uccide un processo e si elimina dopo il completamento. Solo per curiosità. Perché? –

risposta

31
@ECHO OFF 
SETLOCAL 

SET someOtherProgram=SomeOtherProgram.exe 
TASKKILL /IM "%someOtherProgram%" 

ECHO "This script will now self-destruct. Please ignore the next error message" 
DEL "%~f0" 

nota che la linea DEL meglio essere l'ultima cosa che si intende eseguire all'interno del file batch, altrimenti sei fuori di fortuna :)

questo stampa un messaggio di errore brutto, ma è benigno, e il codice è leggermente meno confuso in questo modo. Se ti preoccupi molto di eliminare il messaggio di errore, vedi dbenham's answer per sbarazzartene.

+0

Puoi spiegarlo un po 'per favore? Cos'è someotherprogram.exe e cosa ci barcollano dentro? –

+0

@Richard: 'SomeOtherProgram.exe' può essere modificato per essere un qualsiasi programma. Ad esempio, 'notepad.exe'. Questo è il programma che verrà ucciso e non importa ciò che fa quel programma - questo file batch non interessa. Usa solo 'TaskKill' ​​per uccidere un'attività con quel nome exe. Questo lo chiarisce? Se è così, hai pensato che debba essere aggiunto alla risposta? In caso contrario, si prega di spiegare più in dettaglio le parti che capisci e quali no. –

+2

Grazie per la risposta @Merlyn. Colpa mia, non ho letto bene la domanda. Stavo pensando perché hai bisogno di uccidere un processo per eliminare un blocco stesso. :) –

4

Non hai menzionato il sistema operativo, ma se questo è in Windows XP Professional e disponi delle autorizzazioni appropriate, puoi fare in modo che il file batch pianifichi un'operazione pianificata di Windows in un'unica operazione per eliminare il file in un secondo momento. Utilizzare il comando schtasks, documentato here.

In caso contrario, in genere non è possibile eliminare un file che viene eseguito, poiché questo ha il potenziale per tutti i tipi di cattiveria. Inoltre, tentare di eliminare un eseguibile in uso è considerato come un comportamento molto sospetto da parte di un numero qualsiasi di programmi antivirus, quindi è probabile che si eseguirà anche questo.

+2

In realtà, esiste un modo sorprendentemente semplice per ottenere un file batch da eliminare senza errori che non richiedono autorizzazioni speciali. Vedi [la mia risposta] (http://stackoverflow.com/a/20333152/1012053) – dbenham

1

Basta aggiungere questo comando l'ultima riga del file batch

Del batch_file_name.bat 

batch_file_name.bat è il nome del file batch

Acclamazioni

+2

Non funziona. –

+0

* @ Ricardo Polo * No, non funzionerà perché il processo è bloccato, quindi a meno che il PID non venga rilasciato, il file non verrà eliminato. In realtà ho pensato che questo è quello che viene discusso in precedenza, ma * @ Hani Ludin * sembra aver perso questo! – CriticalPoint

35

La risposta Merlyn Morgan-Graham riesce a eliminare il esegue lo script batch, ma genera il seguente messaggio di errore: "Impossibile trovare il file batch." Questo non è un ap roblem se la finestra della console si chiude quando termina lo script, poiché il messaggio lampeggerà così velocemente che nessuno lo vedrà. Ma il messaggio di errore è molto indesiderato se la console rimane aperta dopo la fine dello script.

John Faminella ha l'idea giusta che è necessario un altro processo per eliminare in modo pulito il file batch senza errori. La pianificazione di un'attività può funzionare, ma esiste un modo più semplice: utilizzare START per avviare una nuova procedura di eliminazione all'interno della stessa console. Ci vuole del tempo per l'avvio e l'esecuzione del processo, 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 

Aggiornamento 2015-07-16

ho scoperto un altro modo davvero chiazza di petrolio di avere uno script batch si elimina senza generare alcun messaggio di errore. La tecnica dipende da un comportamento recente scoperta di GOTO (scoperto da alcuni russi), descritta in lingua inglese presso http://www.dostips.com/forum/viewtopic.php?f=3&t=6491

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

Quindi tutto ciò che serve è

(goto) 2>nul & del "%~f0" 
+1

Mi piace la tua seconda soluzione. Il primo molto probabilmente funzionerà bene, ma non sono sicuro che sia strettamente garantito il funzionamento se 'start' riesce a finire il suo lavoro prima che finisca l'attuale interprete di script in batch. Presumo che qualsiasi condizione di gara sia molto improbabile che sia un problema se lo scheduler di processo funziona in modo decente o il sistema non è sotto carico pesante, quindi è probabilmente solo un pignolo. –

+0

(e "garantito per funzionare", intendo garantito per evitare il messaggio di errore) –

+0

@ MerlynMorgan-Graham - Assolutamente è una condizione di gara, quindi sei tecnicamente corretto. Ma è difficile per me immaginare uno scenario in cui i tempi sono invertiti. Potrebbe essere un progetto interessante provare a programmare un errore – dbenham

0

si potrebbe fare @ risponderti di Merlyn

@ECHO OFF 
SETLOCAL 
SET someOtherProgram=SomeOtherProgram.exe 
TASKKILL /IM "%someOtherProgram%" 
DEL "%~f0" 

Ora fate un VBScript con questa codifica e salvarlo come hidden.vbs, questo VBScript nasconderà il batch finestra del file.

set w = CreateObject(“WScript.Shell”) 
W.Run chr(34) & “%userprofile%\desktop\the_batch_file.bat” & chr(34), 0 
set w= Nothing 

Poi hanno il file batch eseguire questo VBScript

@ECHO OFF 
SETLOCAL 
SET someOtherProgram=SomeOtherProgram.exe 
TASKKILL /IM "%someOtherProgram%" 
start "path to hidden.vbs" 
DEL "%~f0" 

In questo modo nascondere il file batch prima di eliminarlo rendendo il messaggio di errore impossibile da vedere.

0

Si potrebbe anche dirigere l'uscita del DEL "% ~ F0" a NULL in uscita in questo modo ...

@ECHO OFF 
SETLOCAL 
SET someOtherProgram=SomeOtherProgram.exe 
TASKKILL /IM "%someOtherProgram%" 
DEL "%~f0" > NUL 
+2

scusa, ma il messaggio di errore discusso non viene da 'del', ma perché l'interprete prova a leggere il" comando successivo "dal file ora eliminato. Il tuo suggerimento non lo sopprime. – Stephan

+0

Non ho ricevuto alcun messaggio di errore quando l'ho eseguito in questo modo, ma l'ho fatto senza. –

+2

per me è esattamente lo stesso, con o senza '> nul'.Come ho detto: l'errore non proviene da 'del', quindi il reindirizzamento dell'output di' del' non aiuterà (oltre a questo: per eliminare ERRORS, devi reindirizzare STDERR: '2> nul' - che ha vinto ' t aiutare entrambi.) – Stephan

Problemi correlati