[英]Where does the file go after deleting using DEL batch file command in the command prompt?
我有一个简单的批处理文件,它运行并在运行后自行删除。 这个应用程序放在桌面上,将使用注册表 RUNONCE 执行。 要自行删除它,我在下面使用此命令。
goto 2>nul & del /Q "%APP_PATH%"
与下面的命令不同,上面的命令不会在控制台中打印任何错误。
del /Q "%APP_PATH%"
批处理文件已在桌面中删除。 当我们安装我们的内部应用程序(不是恢复应用程序)时,使用DEL
命令删除的批处理文件将恢复到之前的位置。 我还没有机会检查内部应用程序源代码。 通过这个级别的信息,有没有人知道为什么会发生这种奇怪的行为?
Windows 命令处理器cmd.exe
处理批处理文件。 这意味着它打开一个批处理文件,读取下一行,解析它,如果没有更多行要读取,它关闭批处理文件。 然后它在解析的行上执行命令。 请参阅Windows 命令解释器 (CMD.EXE) 如何解析脚本?
如果这里有严重的语法,Windows 命令处理器将退出批处理文件的处理。 此处使用此错误条件处理。
使用以下行创建一个批处理文件:
@echo off
goto
echo Third line!
打开命令提示符并通过键入其完整限定文件名来运行此批处理文件,即驱动器+路径+名称+扩展名用双引号括起来。
由于第二行缺少批处理 label, cmd.exe
出现以下错误消息 output。
没有为 GOTO 命令指定批次 label。
第三行不再由cmd.exe
执行,因为在执行第二个命令行后退出批处理文件处理,这是因为cmd.exe
不清楚在何处继续批处理文件处理的严重语法错误。
现在让我们看一下命令行:
goto 2>nul & del /Q "%APP_PATH%"
这是一个命令行,在一行上有两个命令,正如我在Single line with multiple commands using Windows batch file上的回答中详细描述的那样。
缺少批处理 label 的第一个命令goto
导致退出批处理文件处理。 在这种情况下, cmd.exe
的错误消息 output 将使用2>nul
重定向到设备NUL以抑制它。 但是第二个命令del /Q "%APP_PATH%"
已经扩展了环境变量%APP_PATH%
已经在命令队列中。 出于这个原因,接下来会执行该命令。
然后cmd.exe
甚至不再尝试打开批处理文件以读取第三行,因为无效的goto
命令导致退出批处理文件处理,如果%APP_PATH%
引用批处理的名称,在这种情况下甚至不再存在文件。
顺便说一句: APP_PATH
很奇怪,因为具有完整路径的文件名具有误导性的环境变量名称。
这是一个更好的例子:
首先使用以下行创建一个名为Test1.cmd
的批处理文件:
@echo off
echo %~nx0 is calling Test2.cmd.
call "%~dp0Test2.cmd"
echo %~nx0 is processed further.
使用以下行创建第二个名为Test2.cmd
的批处理文件:
@echo off
set "BatchFile=%~f0"
echo %~nx0 is deleting itself now.
goto 2>nul & del /A /F "%BatchFile%"
然后从命令提示符 window Test1.cmd
中运行。 output 是:
Test1.cmd is calling Test2.cmd.
Test2.cmd is deleting itself now.
Test1.cmd is processed further.
通过cmd.exe
处理Test2.cmd
可以看出Test2.cmd
删除了自己而没有显示任何错误消息。 但是在Test2.cmd
删除自身之后继续处理Test1.cmd
。
/Q
选项在删除单个文件时并不是真正需要的,并且该文件在运行命令时肯定存在。 选项/A
对于删除批处理文件很有用,即使它设置了隐藏属性,否则del
不会删除它。 即使设置了只读属性,选项/F
也可用于删除批处理文件。
另一种命令方法是使用批处理文件中的最后一个命令行,它应该删除自己的命令行:
del /A /F "%~f0" & exit
但它有一个缺点,因为它可以在创建Test2.cmd
时看到:
@echo off
echo %~nx0 is deleting itself now.
del /A /F "%~f0" & exit
从命令提示符 window 中运行Test1.cmd
。 批处理文件Test2.cmd
会自行删除,但命令exit
会导致退出cmd.exe
并打开命令提示符 window 并处理这两个批处理文件。 出于这个原因, Test1.cmd
没有进一步处理,控制台 window 立即关闭。
Appending the option /B
after command exit
would result in not exiting cmd.exe
, but two error messages would be output by cmd.exe
because of not finding anymore Test2.cmd
.
因此,使用goto 2>nul & del /A /F "%~f0"
是自删除批处理文件的最佳实践示例。
顺便说一句:顺序或两个命令很重要。 使用del /A /F "%~f0" & goto 2>nul
会导致 cmd.exe 出现错误消息cmd.exe
,因为在这种情况下,它会尝试再次打开已删除的批处理文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.