¿Cómo hacer que un archivo por lotes se elimine solo?

¿Es posible hacer que un archivo por lotes se elimine por sí solo?

He intentado que ejecute otro archivo para eliminarlo, pero esto no funcionó ¿alguien sabe cómo podría hacerlo? El archivo por lotes que estoy usando es elevado. Mi sistema operativo es Windows 7 de 32 bits.

La respuesta de npocmaka funciona, 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 la secuencia de comandos, ya que el mensaje parpadeará tan rápido que nadie verá eso. Pero es muy indeseable si la consola permanece abierta después de que termina el script.

El truco para eliminar el archivo sin un mensaje de error es obtener otro proceso oculto para eliminar el archivo una vez que termina el script. Esto se puede hacer fácilmente usando START / B para iniciar un proceso de eliminación. Lleva tiempo iniciar y ejecutar el proceso de eliminación, por lo que el script principal tiene la posibilidad de finalizar de forma limpia antes de que suceda la eliminación.

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

Simplemente puede usar una subrutina LLAMADA si le preocupa que SHIFT destruya el valor de %0 .

 call :deleteSelf&exit /b :deleteSelf 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" 
 ( del /q /f "%~f0" >nul 2>&1 & exit /b 0 ) 

Establezca esto al final de la secuencia de comandos. (podría no funcionar si se usa el comando SHIFT )

 del "%~f0" 

funcionará, pero hay un mensaje de error si lo llamas desde una consola abierta anteriormente (sin embargo, se puede ignorar).

 del %0 

Como la última línea del archivo es la forma más fácil que he encontrado. %0 devuelve el nombre del archivo .cmd está ejecutando actualmente.

Cuando lo probé por primera vez, pensé que obtendría un error de “archivo en uso”, pero eso no ha sucedido hasta el momento.

Como respuesta a esta pregunta , (que se pone en espera) este lote se autodestruirá después de tres carreras. El código para lograr esto se condensa en las últimas 3 líneas. Incorpora el consejo anterior de dbenham

 @Echo off Rem batch main purpose Rem Rem Set Tok=###&For /f %%C in ('find /C "%Tok%" ^<"%~f0"') Do Set /A Cnt=%%C Echo Run-%Cnt%&If %Cnt% Geq 3 (goto) 2>nul & del "%~f0" Echo %Tok%>>"%~f0"& Goto :Eof 

El lote se modifica añadiendo un token después de cada ejecución y contando las ocurrencias del token. Si se alcanza el número, se elimina a sí mismo.

 > Dir /B Kill* KillMySelf.cmd > KillMySelf.cmd Run-1 > KillMySelf.cmd Run-2 > KillMySelf.cmd Run-3 > Dir /B Kill* File Not Found 

Puede usar del (name) si lo usa en el escritorio, de lo contrario, use del (path to file ex. del C:\WINDOWS .

PD no hace mensaje de error

del% 0 como la última línea del archivo por lotes

puedes configurar el retraso para evitar las condiciones de carrera, aquí tienes 15 segundos:

 START /B CMD.EXE /D /C "PING.EXE -n 15 127.0.0.1 && DEL prova.bat" 

NOTAS

  • CMD.EXE / D es obligatorio para evitar la ejecución de crap-ware de ejecución automática
  • PING y DEL deben ejecutarse sincrónicamente, por lo que están rodeados de comillas
  • Les digo a los usuarios cómo pasar el nombre del lote usando “% ~ f0”