如何使批处理文件自行删除?

09s*_*enb 36 windows batch-file windows-7 delete-file elevated-privileges

是否有可能使批处理文件删除其自身?

我试图让它执行另一个文件来删除它,但这没有用,是否有人知道我怎么做.我正在使用的批处理文件被提升.我的操作系统是Windows 7 32位.

dbe*_*ham 68

npocmaka的答案有效,但它会生成以下错误消息:" 无法找到批处理文件. "如果在脚本终止时控制台窗口关闭,这不是问题,因为消息将以如此快的速度闪烁,没有人会看到它.但是,如果在脚本终止后控制台仍保持打开状态,则非常不受欢迎.

在没有错误消息的情况下删除文件的技巧是在脚本终止后获取另一个隐藏进程来删除文件.使用START/B可以轻松完成此操作以启动删除过程.删除过程需要一段时间才能启动和执行,因此父脚本有可能在删除发生之前彻底终止.

start /b "" cmd /c del "%~f0"&exit /b
Run Code Online (Sandbox Code Playgroud)

如果您担心SHIFT会破坏该%0值,您可以简单地使用CALLed子例程.

call :deleteSelf&exit /b
:deleteSelf
start /b "" cmd /c del "%~f0"&exit /b
Run Code Online (Sandbox Code Playgroud)

更新2015-07-16

我发现了另一种非常灵活的方法,可以让批处理脚本自行删除,而不会生成任何错误消息.该技术取决于新发现的GOTO行为(由一些俄罗斯人发现),英文描述于http://www.dostips.com/forum/viewtopic.php?f=3&t=6491

总之,(GOTO) 2>NUL行为类似EXIT /B,除了它允许在调用者的上下文中执行连接命令!

所以你需要的只是

(goto) 2>nul & del "%~f0"
Run Code Online (Sandbox Code Playgroud)

  • @RockPaperLz-MaskitorCasket - 没有括号它应该可以正常工作。我包含它们是为了表明我故意不包含 GOTO 的目标。 (2认同)

npo*_*aka 7

( del /q /f "%~f0" >nul 2>&1 & exit /b 0  )
Run Code Online (Sandbox Code Playgroud)

在脚本的末尾设置它.(如果使用SHIFT命令可能不起作用)

  • 这工作,但它生成"***无法找到批处理文件.***"错误.有关解决方案,请参阅[我的回答](http://stackoverflow.com/a/20333575/1012053). (2认同)

Jef*_*Son 5

del "%~f0"
Run Code Online (Sandbox Code Playgroud)

如果你从以前打开的控制台调用它会有错误消息(但可以忽略).