Windows bat文件是否知道其名称,是否可以自行删除

Windows bat文件是否知道其名称,是否可以自行删除,windows,batch-file,Windows,Batch File,在我的脚本中的某个时刻,我希望bat脚本删除自己。这要求脚本知道其名称,然后使用该名称删除自身。这可能吗?如果我没有弄错,则%0将是用于调用批处理文件的路径。已测试并正在运行: del %0 exit %0提供bat文件启动目录的相对路径。所以如果你叫它 mybats\delyourself.bat tango roger %0将包含mybats\delyourself.bat del%0在您未更改当前目录的情况下有效 %~f0检查文件的完整路径。现有的答案都不能为批处理文件删除自身并在没有

在我的脚本中的某个时刻,我希望bat脚本删除自己。这要求脚本知道其名称,然后使用该名称删除自身。这可能吗?

如果我没有弄错,则%0将是用于调用批处理文件的路径。

已测试并正在运行:

del %0
exit

%0提供bat文件启动目录的相对路径。所以如果你叫它

mybats\delyourself.bat tango roger
%0将包含
mybats\delyourself.bat

del%0
在您未更改当前目录的情况下有效


%~f0
检查文件的完整路径。

现有的答案都不能为批处理文件删除自身并在没有任何可见错误消息的情况下退出提供干净的方法

start /b "" cmd /c del "%~f0"&exit /b
只需包含
del“%~f0”
即可删除脚本,但也会导致一条丑陋的“无法找到批处理文件”错误消息

如果脚本可以关闭父CMD进程(控制台窗口),则以下操作可以正常工作,并且没有任何错误消息:

del "%~f0"&exit
但是,如果希望脚本删除自身并在不关闭父CMD进程的情况下退出,并且没有任何错误消息,那么这就有点复杂了

方法1:启动第二个进程,该进程在实际执行删除操作的同一控制台窗口中运行。
EXIT/B
可能不是必需的,但我将它放进去是为了最大限度地提高批处理脚本在启动的进程尝试删除文件之前关闭的可能性

start /b "" cmd /c del "%~f0"&exit /b
方法2:创建并将控制转移到另一个临时批处理文件,该文件删除自身和调用者,但不使用CALL,并将stderr重定向到nul

>"%~f0.bat" echo del "%~f0" "%~f0.bat"
2>nul "%~f0.bat"

对于我来说,退出批处理文件后出现noerrorlevel1是很重要的。我通过这种方式找到了一个合适且简单的答案: 删除我自己。cmd:

START CMD /C DEL DeleteMyself.cmd
如果deleteMelf.cmd返回错误级别0,则测试批处理testdelete.cmd

call DeleteMyself.cmd
echo Errorlevel: %errorLevel%

我很好奇,当一个批处理文件(或任何与此相关的程序)调用另一个批处理文件时会发生什么……第二个批处理文件中的
%0
是什么?我必须尝试一下,但我的猜测是,它是调用方批处理文件中提供的路径。不,它是当前批处理文件。因此,为了确保我理解,如果a.bat调用B.bat,%0是“B.bat”,正确的?这是我的猜测,尽管我可能没有明确说明。%0始终是当前批处理文件的调用。这样做可能更好:
del“%~f0”&exit/b
。“%$f0”负责从不同目录运行批处理文件,并负责路径中的空间。如果在执行
del
之前未缓冲包含
exit
的行,则将这两个命令放在一行上可以避免可能的“未找到文件”错误,这在原始格式中有时可能会发生。最后,
/b
只退出批处理文件,而不是关闭整个控制台。@atzz-但是
退出/b
而不是
退出
会导致一条丑陋的“找不到批处理文件”错误消息。@dbenham-您是正确的。(有趣的是,我不记得以前收到过这个信息;在这几年中,cmd的行为发生了变化吗?还是这是我的记忆?),这比直接关闭控制台要好得多。@atzz-同意:-)请参阅,以获取在没有错误消息的情况下完全删除的方法。不需要
将path\u设置为\u bat=%~f0
,因为
%~f0
将始终提供当前运行的批处理脚本的完整路径,即使在被调用的子例程中使用,或者如果CD或PUSHD从开始就被执行了。当然了!修好了,我不知道为什么我认为需要它。我已经更新了回复。