¿Cómo hacer que el archivo .BAT lo borre después de la finalización?

¿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.

@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 será la última cosa que pretenda ejecutar dentro del archivo por lotes, de lo contrario no tendrá 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, consulte la respuesta de dbenham para deshacerse de él.

La respuesta 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 finaliza el script, ya que el mensaje Destellar 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. Progtwigr 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

Descubrí otra forma muy ingeniosa de borrar un script por lotes sin generar ningún mensaje de error. La técnica depende de un comportamiento recientemente 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 comporta como EXIT /B , ¡excepto que permite la ejecución de comandos concatenados en el contexto de la persona que llama!

Entonces todo lo que necesitas es

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

No mencionó el sistema operativo, pero si se trata de Windows XP Professional y tiene los permisos adecuados, puede hacer que el archivo por lotes programe una Tarea progtwigda de Windows para borrar el archivo en otro momento. Use 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 archivo ejecutable en uso es visto como un comportamiento muy sospechoso por cualquier número de progtwigs antivirus, por lo que es probable que se encuentre con ellos también.

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

Aclamaciones

podrías hacer @ aswer de Merlyn

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

Ahora crea un vbscript con esta encoding y guárdalo como hidden.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 que el mensaje de error sea imposible de ver.

También podría dirigir la salida del DEL “% ~ f0” a la salida NULL así …

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