del
和ErrorLevel
?
只要给定的参数有效,该del
命令就不会设置,它甚至会在这种情况下将 重置为(至少对于 Windows 7 而言)。ErrorLevel
ErrorLevel
0
del
ErrorLevel
仅在提供无效开关(del /X
设置ErrorLevel
为1
)、根本没有指定参数(del
设置ErrorLevel
为1
太)或给出不正确的文件路径(del :
设置ErrorLevel
为)的情况下修改唯一123
,至少对于 Windows 7。
可能的解决方法
一种可能的解决方法是捕获 的STDERR
输出del
,因为在删除错误的情况下,相关的消息 ( Could Not Find [...]
, Access is denied.
, The process cannot access the file because it is being used by another process.
) 会写入那里。这可能看起来像:
for /F "tokens=*" %%# in ('del /F /Q "\path\to\the\file_s.txt" 2^>^&1 1^> nul') do (2> nul set =)
要直接在命令提示符中而不是在批处理文件中使用代码,请编写%#
而不是%%#
.
如果不想删除只读文件,/F
从命令行删除del
;
如果您确实需要提示(如果通配符?
和/或*
文件路径中存在),请删除/Q
.
代码说明
这将执行命令行del /F /Q "\path\to\the\file_s.txt"
。通过 part 2>&1 1> nul
,命令输出STDOUT
将被解除,其STDERR
输出将被重定向以便for /F
接收它。
如果删除成功,del
则不会生成STDERR
输出,因此for /F
循环不会迭代,因为没有要解析的内容。请注意,ErrorLevel
在这种情况下不会重置,其值保持不变。
如果从命令行接收到for /F
任何STDERR
输出,则执行循环体中的命令,即; 这是无效的语法,因此将 设置为。该部分避免显示消息。del
set =
set
ErrorLevel
1
2> nul
The syntax of the command is incorrect.
要ErrorLevel
明确设置,您还可以使用cmd /C exit /B 1
. 也许这条线更清晰。当然它更灵活,因为您可以声明任何(有符号的 32 位)数字,包括0
清除它(省略数字也会清除它)。不过在性能方面可能会差一些。
应用示例
以下批处理文件演示了如何应用上述解决方法:
:DELETE
echo Deleting "%~1"...
rem this line resets ErrorLevel initially:
cmd /C exit /B
rem this line constitutes the work-around:
for /F "tokens=*" %%# in ('del /F /Q "C:\Users\newuser\Desktop\%~1" 2^>^&1 1^> nul') do (2> nul set =)
rem this is the corrected ErrorLevel query:
if not ErrorLevel 1 echo Deleted "%~1" succesfully.
goto :EOF
预设ErrorLevel
除了上面提到的命令,cmd /C exit /B
你还可以使用. 这可以与这样的循环解决方法结合使用:> nul ver
ErrorLevel
for /F
> nul ver & for /F "tokens=*" %%# in ('del /F /Q "\path\to\the\file_s.txt" 2^>^&1 1^> nul') do (2> nul set =)
没有的替代方法for /F
该命令也可以像 一样使用,而不是for /F
用于捕获 的STDERR
输出,如果输入一个空字符串,则返回一个of ,否则:del
find
find /V ""
ErrorLevel
1
0
del "\path\to\the\file_s.ext" 2>&1 1> nul | find /V "" 1> nul 2>&1
但是,如果删除成功,如果没有成功,这将返回一个ErrorLevel
of 。为了扭转这种行为,可以像这样附加一个/子句:1
0
if
else
del "\path\to\the\file_s.ext" 2>&1 1> nul | find /V "" 1> nul 2>&1 & if ErrorLevel 1 (1> nul ver) else (2> nul set =)
不同的方法:在之后检查文件是否存在del
一种完全不同的方法是在尝试删除文件后检查文件是否存在(感谢用户Sasha的提示!),例如:
del /F /Q "\path\to\the\file_s.txt" 1> nul 2>&1
if exist "\path\to\the\file_s.txt" (2> nul set =) else (1> nul ver)