有没有可能让批处理文件自我删除?
我尝试执行另一个文件以删除它,但这没起作用。
有没有人知道我该怎么做?
我正在使用被提升的批处理文件。我的操作系统是Windows 7 32位。
有没有可能让批处理文件自我删除?
我尝试执行另一个文件以删除它,但这没起作用。
有没有人知道我该怎么做?
我正在使用被提升的批处理文件。我的操作系统是Windows 7 32位。
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
( del /q /f "%~f0" >nul 2>&1 & exit /b 0 )
(goto)
解决方案则不允许。 - vvnurmidel "%~f0"
这段代码可以正常运行,但如果你在之前打开的控制台中调用它,会出现错误提示(不过可以忽略)。
del %0
%0
返回当前正在执行的 .cmd
文件的名称。在批处理文件的最后一行添加“del %0”。
@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
@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
您可以设置延迟以避免竞态条件,这里是15秒:
START /B CMD.EXE /D /C "PING.EXE -n 15 127.0.0.1 && DEL prova.bat"
注释
如果要删除桌面上的文件,可以使用del (name)
,否则可以使用del (文件路径,例如 del C:\WINDOWS)
。
附注:不会产生错误信息。
这个很简单。
(/Q 是为了不必确认删除文件。)
goto 2> nul & …
- Scott - Слава Україніf0”,但是我的cmd窗口在脚本完成后没有自动关闭。如果只使用“exit /b”,它会关闭。如果我在结尾处添加“exit /b”和“goto 2>nul & del”命令,“%f0”,它将不会关闭。你知道为什么吗?如何让它自动关闭?谢谢。 - Billy Cao