2010-05-22 25 views
25

¿Cómo hacer que el archivo .BAT lo borre después de la finalización? Tengo un archivo bat simple que termina un proceso. Quiero que el archivo .BAT se elimine solo.¿Cómo hacer que el archivo .BAT lo elimine después de la finalización?

+6

Así que quieres un archivo por lotes que no muestra ninguna ventana, mata a una proceso y se elimina después de la finalización. Solo por curiosidad. ¿Por qué? –

Respuesta

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" 

Tenga en cuenta que la línea DEL mejor que sea lo último que se va a ejecutar dentro del archivo por lotes, de lo contrario estás de suerte :)

Esto imprimirá un mensaje de error feo, pero es benigno, y el código es un poco menos confuso de esta manera. Si le importa mucho deshacerse del mensaje de error, vea dbenham's answer para deshacerse de él.

+0

¿Puede explicar esto un poco por favor? ¿Qué es someotherprogram.exe y qué descargas dentro? –

+0

@Richard: 'SomeOtherProgram.exe' podría cambiarse para que sea cualquier programa. Por ejemplo, 'notepad.exe'. Este es el programa que se eliminará, y no importa lo que haga ese programa, este archivo por lotes no le importa. Solo usa 'TaskKill' ​​para matar una tarea con ese nombre de exe. ¿Esto lo aclara? Si es así, ¿crees que debe agregarse a la respuesta? De lo contrario, explique con más detalle qué partes entiende y cuáles no. –

+2

Gracias por su respuesta @Merlyn. Mi culpa, no leí bien la pregunta. Estaba pensando por qué necesitas matar un proceso para eliminar un murciélago. :) –

4

No mencionó el sistema operativo, pero si esto es en Windows XP Professional y tiene los permisos apropiados, puede hacer que el archivo por lotes programe una Tarea programada de Windows para borrar el archivo en otro momento. Utilice el comando schtasks, documentado here.

De lo contrario, normalmente no puede eliminar un archivo que se está ejecutando, ya que tiene el potencial de todo tipo de maldad. Además, tratar de eliminar un archivo ejecutable en uso es visto como un comportamiento muy sospechoso por cualquier número de programas antivirus, por lo que es probable que se encuentre con ellos también.

+2

En realidad, hay una forma sorprendentemente simple de borrar un archivo por lotes sin errores que no requieren permisos especiales. Ver [mi respuesta] (http://stackoverflow.com/a/20333152/1012053) – dbenham

1

Sólo añadir este comando en la última línea de su archivo por lotes

Del batch_file_name.bat 

batch_file_name.bat es el nombre de su archivo por lotes

Saludos

+2

No funciona. –

+0

* @ Ricardo Polo * No, no funcionará porque el proceso está bloqueado, por lo tanto, a menos que se libere el PID, el archivo no se eliminará. De hecho, pensé que esto es lo que se está discutiendo arriba, ¡pero * @ Hani Ludin * parece haberse perdido esto! – CriticalPoint

35

La respuesta Merlyn Morgan-Graham se las arregla para eliminar la ejecución de secuencia de comandos por lotes, pero genera el siguiente mensaje de error: "El archivo de proceso por lotes no se puede encontrar." Esto no es ap Si la ventana de la consola se cierra cuando la secuencia de comandos finaliza, el mensaje parpadeará tan rápido que nadie lo verá. Pero el mensaje de error es muy indeseable si la consola permanece abierta después de la finalización del script.

John Faminella tiene la idea correcta de que se necesita otro proceso para borrar limpiamente el archivo por lotes sin error. Programar una tarea puede funcionar, pero hay una manera más simple: use START para iniciar un nuevo proceso de eliminación dentro de la misma consola. Lleva tiempo iniciar y ejecutar el proceso, por lo que el script principal tiene la posibilidad de finalizar de manera limpia antes de que ocurra la eliminación.

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

actualización 2015-07-16

he descubierto otra forma muy resbaladizo para tener un script por lotes borrarse a sí mismo sin generar ningún mensaje de error. La técnica depende de un comportamiento recién descubierto de GOTO (descubierto por algunos rusos), que se describe en Inglés en http://www.dostips.com/forum/viewtopic.php?f=3&t=6491

En resumen, (GOTO) 2>NUL se comporta como EXIT /B, excepto que permite la ejecución de comandos concatenados en el contexto de la persona que llama!

Así que todo lo que necesita es

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

Me gusta su segunda solución. El primero muy probablemente funcionará bien, pero no estoy seguro de que esté estrictamente garantizado que funcione si 'start' logra finalizar su trabajo antes de que finalice el intérprete actual del script por lotes. Supongo que cualquier condición de carrera es muy poco probable que sea un problema si el programador del proceso está funcionando decentemente o si el sistema no está sometido a una gran carga, por lo que es probable que solo sea un truco. –

+0

(y por "garantizado para trabajar", me refiero a garantizado para evitar el mensaje de error) –

+0

@ MerlynMorgan-Graham - Absolutamente es una condición de carrera, por lo que está técnicamente correcto. Pero es difícil para mí imaginar un escenario donde los tiempos se inviertan. Puede ser un proyecto interesante tratar de diseñar una falla – dbenham

0

que podría hacer @ aswer de Merlyn

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

Ahora hacen un VBScript con esta codificación y guárdelo como hidden.vbs, este VBScript, se oculta el lote ventana del archivo

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

Luego tienen el archivo por lotes ejecutar este VBScript

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

Esto ocultará el archivo por lotes antes de eliminarlo haciendo que el mensaje de error imposible de ver.

0

También puede dirigir la salida de la DEL "% ~ f0" a NULL salida es similar a ...

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

lo siento, pero el mensaje de error discutido no viene de 'del', sino porque el intérprete intenta leer el "próximo comando" del archivo ahora eliminado. Su sugerencia no suprime eso. – Stephan

+0

No recibí ningún mensaje de error cuando lo ejecuté de esta manera, pero lo hice sin él. –

+2

para mí es exactamente lo mismo, con o sin '> nul'.Como dije: el error no proviene de 'del', por lo que redirigir la salida de' del' no ayudará (además de eso: para suprimir ERRORS, debe redirigir STDERR: '2> nul' - que ganó ' t ayuda tampoco.) – Stephan

Cuestiones relacionadas