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

时间:2013-12-02 13:21:26

标签: windows batch-file windows-7 delete-file elevated-privileges

是否可以将批处理文件删除为自己?

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

9 个答案:

答案 0 :(得分:63)

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

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

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

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

call :deleteSelf&exit /b
:deleteSelf
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"

答案 1 :(得分:7)

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

在脚本末尾设置此项。 (如果使用SHIFT命令,则可能无效)

答案 2 :(得分:5)

del "%~f0"

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

答案 3 :(得分:2)

del %0

由于文件的最后一行是我找到的最简单的方法。 %0返回当前正在执行的.cmd文件的名称。

当我第一次尝试时,我以为我会收到“正在使用中的文件”错误,但到目前为止还没有发生。

答案 4 :(得分:1)

作为this question的答案(暂停),此批次将在三次运行后自行构建。实现此目的的代码在最后3行中浓缩。它包含above tip from 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

答案 5 :(得分:0)

如果桌面上有del (name),则可以使用del (path to file ex. del C:\WINDOWS,否则请使用{{1}}。

P.S不会出错msg

答案 6 :(得分:0)

del%0 作为批处理文件的最后一行

答案 7 :(得分:0)

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

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

注意

  • CMD.EXE / D必须避免执行自动运行的crap-ware
  • PING和DEL必须同步执行,因此用引号
  • 包围
  • 我告诉用户如何使用&#34;%~f0&#34;
  • 传递批名称

答案 8 :(得分:0)

如果其他人试图使用user6811411的3运行然后自毁脚本,则该脚本不起作用。我发现&的解释不正确。我的解决方案只是将如下所示的命令分开。

@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
相关问题