繁体   English   中英

在命令提示符下使用 DEL 批处理文件命令删除后文件 go 在哪里?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM