¿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?
Respuesta
@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.
¿Puede explicar esto un poco por favor? ¿Qué es someotherprogram.exe y qué descargas dentro? –
@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. –
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. :) –
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.
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
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
No funciona. –
* @ 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
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"
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. –
(y por "garantizado para trabajar", me refiero a garantizado para evitar el mensaje de error) –
@ 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
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.
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
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
No recibí ningún mensaje de error cuando lo ejecuté de esta manera, pero lo hice sin él. –
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
- 1. Hacer que MSDeploy (Visual Studio) no elimine la carpeta App_Data, pero elimine todo lo demás
- 2. Esperando que el sistema elimine el archivo
- 3. File.Copy bloquea el archivo fuente después de la finalización
- 4. Cómo hacer que Hibernate no elimine tablas
- 5. script php que se borra después de la finalización
- 6. ¿Cómo ejecuto un archivo bat en el fondo de otro archivo bat?
- 7. Haga que el archivo .bat continúe después de ejecutar un comando
- 8. ASP.NET ¿Cómo puedo escribir un mensaje en la pantalla sin que el usuario final lo elimine?
- 9. Cómo ejecutar múltiples archivos .BAT dentro de un archivo .BAT
- 10. Cómo hacer que Varnish ignore, no elimine las cookies
- 11. Llamar a un archivo .BAT desde otro archivo .bat
- 12. ¿Cómo reproducir la carpeta bin en Eclipse después de que se elimine?
- 13. Cómo hacer que el script php se elimine (e incluye el directorio)
- 14. ¿Cómo hacer que un MovieClip se elimine solo en AS3?
- 15. Asegurarse de que el archivo se elimine en JVM exit
- 16. Cómo ejecutar la aplicación Java mediante el archivo .bat
- 17. Cómo puedo hacer que un cuadro de entrada HTML elimine el texto predeterminado DESPUÉS de comenzar a escribir
- 18. Ejecutando el archivo .bat desde TeamCity
- 19. Finalización de la pestaña Bash agrega espacio extra después de la primera finalización
- 20. Creando una carpeta usando el archivo bat
- 21. Expresión regular, elimine todo después de la última barra diagonal
- 22. Cómo evitar que el archivo de proceso por lotes (.bat) se cierre al ejecutar comandos?
- 23. Volumen EC2: ¿cómo lo configuro para que se elimine en la terminación?
- 24. ¿Cómo escribir un programa en C++ de modo que se elimine después de la ejecución?
- 25. Cómo detener el proceso desde el archivo .BAT?
- 26. ¿Cómo evito que FormView elimine los valores ingresados del usuario después de que se haya activado el método de inserción?
- 27. grep string después de lo que especifico
- 28. ¿Cómo hacer que el archivo sea escaso?
- 29. ¿Cómo hacer que NSSearchField envíe acción después de la autocompletación?
- 30. ¿Cómo puedo hacer que carrierwave no guarde el archivo original después de procesar las versiones?
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é? –