Cómo hacer.BAT archivo eliminarlo uno mismo después de la finalización?


Cómo hacer .BAT archivo eliminarlo uno mismo después de la finalización? Tengo un simple archivo bat que termina un proceso. Quiero eso .BAT archivo para eliminar a sí mismo.

Author: Brian Tompsett - 汤莱恩, 2010-05-22

6 answers

@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 es mejor que la línea DEL sea la última cosa que tiene la intención de ejecutar dentro del archivo por lotes, de lo contrario no tendrá suerte:)

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

 33
Author: Merlyn Morgan-Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:19

La respuesta de Merlyn Morgan-Graham logra eliminar el script por lotes en ejecución, pero genera el siguiente mensaje de error: "No se puede encontrar el archivo por lotes." Esto no es un problema si la ventana de la consola se cierra cuando el script termina, ya que 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 terminación del script.

John Faminella tiene la idea correcta de que se necesita otro proceso para elimine limpiamente el archivo por lotes sin error. Programar una tarea puede funcionar, pero hay una forma más sencilla: use START para iniciar un nuevo proceso de eliminación dentro de la misma consola. Toma tiempo para que el proceso se inicie y ejecute, por lo que el script padre tiene la oportunidad de terminar limpiamente antes de que ocurra la eliminación.

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

Actualizar 2015-07-16

He descubierto otra forma realmente ingeniosa de tener un script por lotes que se elimine sin generar ningún mensaje de error. El la técnica depende de un comportamiento recién descubierto de GOTO (descubierto por algunos rusos), descrito 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 del llamador!

Así que todo lo que necesitas es

(goto) 2>nul & del "%~f0"
 37
Author: dbenham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-06 12:30:20

No mencionó el sistema operativo, pero si esto es en Windows XP Professional y tiene los permisos adecuados, puede hacer que el archivo por lotes programe una tarea programada de Windows de una sola vez para eliminar el archivo en un momento posterior. Utilice el comando schtasks, documentado aquí.

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 ejecutable en uso se ve como muy comportamiento sospechoso por cualquier número de programas antivirus, por lo que es probable que se ejecutaría en conflicto con estos también.

 4
Author: John Feminella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-22 17:09:17

Simplemente agregue 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

Salud

 1
Author: Hani Ludin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-15 15:35:08

Podrías hacer @Merlyn's aswer

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

Ahora haga un vbscript con esta codificación y guárdelo como oculto.vbs, este vbscript ocultará la ventana del archivo por lotes.

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

Luego haga que el archivo por lotes ejecute 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 imposible ver el mensaje de error.

 0
Author: Jason Towan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-30 04:59:00

También podría dirigir la salida del DEL "%~f0" a una salida NULA como esta...

@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
DEL "%~f0" > NUL
 0
Author: Chad Estes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-29 15:02:35