蝙蝠文件是否知道它的名字,可以删除它自己

在脚本中的某个时刻,我希望bat脚本自己删除。 这要求脚本知道它的名字,然后使用这个名字来删除它自己。 这可能吗?

现有的答案都没有为批处理文件提供一个干净的方式来删除自己,并退出没有任何可见的错误信息。

简单的包括del "%~f0"确实会删除脚本,但是也会导致一个丑陋的“无法找到批处理文件”。 错误信息。

如果脚本可以关闭父CMD进程(控制台窗口),那么以下工作正常,没有任何错误消息:

 del "%~f0"&exit 

但是,如果您希望脚本自行删除并退出而不关闭父CMD过程,并且没有任何错误消息,则会更复杂一些。

方法1:启动在实际执行删除的同一控制台窗口中运行的第二个进程。 EXIT /B可能不是必需的,但我把它放在最大化批处理脚本将在STARTed进程尝试删除文件之前关闭的可能性。

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

方法2:创建控制权并将其转移到另一个临时批处理文件,该文件可以删除自己以及调用者,但不要使用CALL,并将stderr重定向到nul。

 >"%~f0.bat" echo del "%~f0" "%~f0.bat" 2>nul "%~f0.bat" 

如果我没有弄错,%0将是用于调用批处理文件的路径。

测试和工作:

 del %0 exit 

%0给出了来自bat文件启动目录的相对路径。 所以如果你叫它

 mybats\delyourself.bat tango roger 

%0将包含mybats\delyourself.bat

del %0工程,如果你还没有改变你的当前目录。

%~f0 〜f0扩展到文件的完整路径。

对我来说,重要的是我退出批处理文件后没有 errorLevel 1。 我用这种方法找到了一个合适的和简单的答案: DeleteMyself.cmd:

 START CMD /C DEL DeleteMyself.cmd 

如果DeleteMyself.cmd返回errorLevel 0,则测试批处理。TestDeleteMyself.cmd

 call DeleteMyself.cmd echo Errorlevel: %errorLevel%