如何使batch file自己删除?

是否有可能使batch file删除自己?

我试图让它执行另一个文件来删除它,但是这不起作用有没有人知道我可以做到这一点。 我正在使用的batch file被提升。 我的操作系统是Windows 7 32位。

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

删除文件没有错误消息的诀窍是获得另一个隐藏的进程在脚本终止后删除文件。 这可以使用START / B轻松完成删除过程。 删除过程需要一些时间来启动和执行,所以父脚本有机会在删除发生之前干净地终止。

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

你可以简单地使用一个CALLed子程序,如果你担心SHIFT垃圾的%0值。

 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" 
 ( del /q /f "%~f0" >nul 2>&1 & exit /b 0 ) 

将其设置在脚本的末尾。 (如果使用SHIFT命令,则可能不起作用)

 del "%~f0" 

将工作,但如果您从以前打开的控制台调用它(但可以忽略),则会出现错误消息。

 del %0 

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

当我第一次尝试时,我想我会得到一个“文件正在使用”错误,但迄今为止还没有发生。

作为对这个问题的回答, 这个批处理会在三次运行后自毁。 实现这个的代码在最后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 

如果在桌面上使用del (name)则可以使用del (name) del (path to file ex. del C:\WINDOWS

PS不会使错误消息

del%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”来传递批名