如何让.BAT文件在完成后自行删除?我有一个终止进程的简单 bat 文件。我希望那个 .BAT 文件自行删除。
7 回答
Merlyn Morgan-Graham 的答案设法删除了正在运行的批处理脚本,但它会生成以下错误消息:“找不到批处理文件。 ”如果在脚本终止时控制台窗口关闭,这不是问题,因为该消息将一闪而过,没有人会看到。但是如果控制台在脚本终止后仍然打开,则错误消息是非常不可取的。
John Faminella 有一个正确的想法,即需要另一个进程来干净地删除批处理文件而不会出错。调度任务可以工作,但有一种更简单的方法:使用 START 在同一控制台中启动新的删除进程。进程启动和执行需要时间,因此父脚本有机会在删除发生之前干净地终止。
start /b "" cmd /c del "%~f0"&exit /b
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"
@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"
请注意,DEL 行最好是您打算在批处理文件中执行的最后一件事,否则您就不走运了 :)
这将打印出一个丑陋的错误消息,但它是良性的,并且这样的代码稍微不那么混乱。如果您非常关心摆脱错误消息,请参阅dbenham 的回答以摆脱它。
您没有提到操作系统,但如果这是在 Windows XP Professional 上并且您具有适当的权限,您可以让批处理文件安排一次性 Windows 计划任务,以便稍后删除文件。使用这里schtasks
记录的命令。
否则,您通常无法删除正在执行的文件,因为这可能会带来各种麻烦。此外,任何数量的防病毒程序都将尝试删除正在使用的可执行文件视为非常可疑的行为,因此您很可能也会与这些行为发生冲突。
只需在批处理文件的最后一行添加此命令
Del batch_file_name.bat
batch_file_name.bat
是您的批处理文件的名称
干杯
你可以做@Merlyn 的回答
@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
DEL "%~f0"
现在用这个编码制作一个vbscript并将它保存为hidden.vbs,这个vbscript将隐藏批处理文件的窗口。
set w = CreateObject(“WScript.Shell”)
W.Run chr(34) & “%userprofile%\desktop\the_batch_file.bat” & chr(34), 0
set w= Nothing
然后让批处理文件运行这个 vbscript
@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
start "path to hidden.vbs"
DEL "%~f0"
这将在删除批处理文件之前隐藏它,从而使错误消息无法看到。
您还可以像这样将DEL "%~f0"的输出定向 到 NULL 输出...
@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
DEL "%~f0" > NUL
内联 next 命令以幽灵自我的身份执行“最后的事情”。它可以是退出命令或退出之前的其他一些东西。
@echo off
del "%~f0" && echo All's done. I must exit! && pause > nul && exit