如何制作.BAT文件完成后自行删除?

Rel*_*lla 28 process batch-file delete-file

如何制作.BAT文件完成后自行删除?我有一个简单的bat文件终止进程.我希望.BAT文件删除自己.

dbe*_*ham 43

Merlyn Morgan-Graham的答案设法删除正在运行的批处理脚本,但它会生成以下错误消息:" 无法找到批处理文件. "如果脚本终止时控制台窗口关闭,这不是问题,因为消息将闪过这么快就没有人会看到它.但是,如果在脚本终止后控制台仍保持打开状态,则非常不希望出现错

John Faminella有正确的想法,需要另一个过程来干净地删除批处理文件而不会出错.调度任务可以工作,但有一种更简单的方法:使用START在同一控制台中启动新的删除过程.进程启动和执行需要一些时间,因此父脚本有可能在删除发生之前彻底终止.

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)

  • 我喜欢你的第二个解决方案。第一个很可能会很好地工作,但我不确定如果`start` 设法在当前批处理脚本解释器完成之前完成它的工作,它是否能严格保证工作。我认为,如果进程调度程序正常工作或系统负载不高,那么任何竞争条件都不太可能成为问题,所以这可能只是一个吹毛求疵。 (3认同)
  • @djvg - 如果它不起作用,我会感到震惊。仅当没有未完成的“CALL”例程返回时,“(goto)”技术才会退出批处理。如果存在未完成的“CALL”,则“(goto)”将退出子例程而不是批处理,并且无论 Windows 版本如何,您都将(应该)收到批处理文件未找到消息。 (2认同)

Mer*_*ham 34

@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"
Run Code Online (Sandbox Code Playgroud)

注意,DEL行最好是你打算在批处理文件中执行的最后一件事,否则你运气不好:)

这将打印出一个丑陋的错误消息,但它是良性的,并且代码稍微不那么令人困惑.如果你非常关心摆脱错误信息,请参阅dbenham的答案以摆脱它.

  • 批处理文件将自行删除,但是很难看到"批处理文件无法找到".生成错误消息.有关要删除且没有错误的方法,请参阅[我的回答](http://stackoverflow.com/a/20333152/1012053). (5认同)
  • 谢谢你回答@Merlyn.我的错,我没读好这个问题.我在想你为什么要杀死一个删除蝙蝠本身的过程.:) (2认同)