如何制作一个批处理文件自我删除?

50

有没有可能让批处理文件自我删除?

我尝试执行另一个文件以删除它,但这没起作用。

有没有人知道我该怎么做?

我正在使用被提升的批处理文件。我的操作系统是Windows 7 32位。

10个回答

84
npocmaka的回答是正确的,但它会生成以下错误消息:“无法找到批处理文件。”如果控制台窗口在脚本终止时关闭,这不是问题,因为消息会闪过得很快,没有人会看到它。但如果控制台在脚本终止后仍然保持打开状态,则非常不希望出现这种情况。
删除文件而不出现错误消息的技巧是在脚本终止后让另一个隐藏的进程删除该文件。可以使用START /B启动删除进程轻松完成此操作。删除进程需要时间来初始化和执行,因此在删除发生之前,父脚本有机会干净地终止。
start /b "" cmd /c del "%~f0"&exit /b

如果你担心SHIFT会破坏%0的值,那么你可以简单地使用一个被调用的子程序。

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

更新于2015年7月16日

我发现了另一种非常巧妙的批处理脚本删除自身的方法,而不会生成任何错误消息。这种技术依赖于GOTO的一个新发现行为(由一些俄罗斯人发现),在http://www.dostips.com/forum/viewtopic.php?f=3&t=6491上有英文描述。

简单来说,(GOTO) 2>NUL的行为类似于EXIT /B,但它允许在调用者的上下文中执行连接的命令!

所以你只需要:

(goto) 2>nul & del "%~f0"

由于DEL是最后一个命令并且它总是清除ERRORLEVEL,因此返回的ERRORLEVEL将为0。

如果您需要控制ERRORLEVEL,则可以使用类似以下的内容:

(goto) 2>nul & del "%~f0" & cmd /c exit /b 10

1
我认为这个代码没有括号也可以正常工作;即goto 2> nul & … - Scott - Слава Україні
@Scott 我同意。似乎没有括号也能正常工作。我实际上只是创建了一个批处理文件,它创建另一个批处理文件,在完成所有工作后删除自身! - RockPaperLz- Mask it or Casket
2
@RockPaperLz-MaskitorCasket - 没有括号也应该可以正常工作。我包含它们只是为了明显地表明我故意没有为GOTO指定目标。 - dbenham
谢谢,你的解决方案非常优雅。 - Sergio Perez
1
嗨,我有一个问题 - 我使用了“goto 2>nul & del”命令,“%f0”,但是我的cmd窗口在脚本完成后没有自动关闭。如果只使用“exit /b”,它会关闭。如果我在结尾处添加“exit /b”和“goto 2>nul & del”命令,“%f0”,它将不会关闭。你知道为什么吗?如何让它自动关闭?谢谢。 - Billy Cao
显示剩余3条评论

9
( del /q /f "%~f0" >nul 2>&1 & exit /b 0  )

将其设置在脚本结尾处。(如果使用SHIFT命令,则可能无效。)

2
这个可以运行,但是会生成“无法找到批处理文件。”的错误。请查看我的答案获取解决方案。 - dbenham
这使得你可以返回一个任意的错误代码,而(goto)解决方案则不允许。 - vvnurmi
1
@vvnurmi - 我已经更新了解决方案(goto),展示如何返回自己的错误代码。 - dbenham

5
del "%~f0"

这段代码可以正常运行,但如果你在之前打开的控制台中调用它,会出现错误提示(不过可以忽略)。


4
del %0

作为文件的最后一行是我发现的最简单的方法。%0 返回当前正在执行的 .cmd 文件的名称。
当我第一次尝试时,我认为会出现“文件正在使用”的错误,但到目前为止还没有发生过。

1

在批处理文件的最后一行添加“del %0”。


1
作为对这个问题的回答,(该问题已被搁置),此批处理将在三次运行后自毁。实现此目标的代码压缩在最后3行中。它包含了dbenham的上述提示
@Echo off
Rem batch main purpose
Rem
Rem
Set Tok=###&For /f %%C in ('find /C "%Tok%" ^<"%~f0"') Do Set /A Cnt=%%C
Echo Run-%Cnt%&If %Cnt% Geq 3 (goto) 2>nul & del "%~f0"
Echo %Tok%>>"%~f0"& Goto :Eof

批处理程序通过在每次运行后添加一个令牌并计算令牌出现的次数来修改自身。如果达到了指定次数,它将删除自己。
> Dir /B Kill*
KillMySelf.cmd

> KillMySelf.cmd
Run-1

> KillMySelf.cmd
Run-2

> KillMySelf.cmd
Run-3

> Dir /B Kill*
File Not Found

0
如果有人尝试使用user6811411的“运行三次然后自毁”的脚本,但是它无法正常工作。我发现&符号没有被正确解释。我的解决方案是将命令分开,如下所示。
@Echo off
Rem batch main purpose
Rem
Rem
Set Tok=###
For /f %%C in ('find /C "%Tok%" ^<"%~f0"') Do Set /A Cnt=%%C
Echo Run-%Cnt%
If %Cnt% Geq 3 (goto) 2>nul & del "%~f0"
Echo %Tok%>>"%~f0" & Goto :Eof

0

您可以设置延迟以避免竞态条件,这里是15秒:

START /B CMD.EXE /D /C "PING.EXE -n 15 127.0.0.1 && DEL prova.bat"

注释

  • CMD.EXE /D 是必须的,以避免执行自动运行的垃圾软件
  • PING 和 DEL 必须同步执行,因此要用引号括起来
  • 我让用户使用 "%~f0" 传递批处理文件名

您还可以使用TIMEOUT命令来使其等待,并使其对常规用户不那么刺耳。您也可以按一个按钮提前结束它。请注意,它仅适用于Windows 7及更高版本。 - MDuh

0

如果要删除桌面上的文件,可以使用del (name),否则可以使用del (文件路径,例如 del C:\WINDOWS)

附注:不会产生错误信息。


0

这个很简单。

@echo off
del /Q batchfilename.bat

(/Q 是为了不必确认删除文件。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接