如何让 .BAT 文件在完成后自我删除?我有一个简单的批处理文件,可以终止一个进程。我想让这个 .BAT 文件自我删除。
如何让 .BAT 文件在完成后自我删除?我有一个简单的批处理文件,可以终止一个进程。我想让这个 .BAT 文件自我删除。
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"
(goto) 2>nul & del "%~f0"
,完美地运行了,批处理文件被删除且没有出现错误信息。 - 5202456(goto)
技巧是否仍然有效吗?在Windows 10上对我有效,但是从一个Windows 11用户那里得到了报告,提到了错误消息:“找不到批处理文件”。 - djvg(goto)
技术只有在没有未完成的 CALL
子程序需要返回时才会退出批处理。如果存在未完成的 CALL
,那么 (goto)
将退出子例程而不是批处理,并且无论 Windows 版本如何,您都将(应该)收到批处理文件未找到的消息。 - dbenham@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的答案以消除它。
SomeOtherProgram.exe
可以更改为任何程序。例如,notepad.exe
。这是将被终止的程序,而该程序所做的事情并不重要 - 此批处理文件并不关心。它只使用 TaskKill
来终止具有该 exe 名称的任务。这样清楚吗?如果是,请问您是否认为需要将其添加到答案中?如果不是,请详细说明您理解的哪些部分,哪些部分不理解。 - Merlyn Morgan-GrahamECHO ..
和 DEL ..
替换为 DEL "%~f0" & EXIT
来避免看到消息“找不到批处理文件”。 - Brankodel "%~f0" & exit
有用的一种情况是如果自删除批处理文件是通过 cmd /c selfDeletingBatch.bat
启动的。这将保留控制台,并且不会打印错误消息。 - dbenham@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
DEL "%~f0"
set w = CreateObject(“WScript.Shell”)
W.Run chr(34) & “%userprofile%\desktop\the_batch_file.bat” & chr(34), 0
set w= Nothing
@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
start "path to hidden.vbs"
DEL "%~f0"
Del batch_file_name.bat
batch_file_name.bat
是你的批处理文件的名称。
祝好!
内联下一个命令来执行“最后的事情”作为幽灵自己。它可以是退出命令或其他一些在退出之前执行的事情。
@echo off
del "%~f0" && echo All's done. I must exit! && pause > nul && exit
你也可以将 DEL "%~f0" 的输出重定向到 NULL 输出,像这样...
@ECHO OFF
SETLOCAL
SET someOtherProgram=SomeOtherProgram.exe
TASKKILL /IM "%someOtherProgram%"
DEL "%~f0" > NUL
del
命令,而是因为解释器试图从已删除的文件中读取“下一个命令”。您的建议并不能解决这个问题。 - Stephan