del和ErrorLevel?
只要给定的参数有效,该del命令就不会设置,它甚至会在这种情况下将 重置为(至少对于 Windows 7 而言)。ErrorLevelErrorLevel0
delErrorLevel仅在提供无效开关(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输出,则执行循环体中的命令,即; 这是无效的语法,因此将 设置为。该部分避免显示消息。delset =setErrorLevel12> nulThe 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 verErrorLevelfor /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 ,否则:delfindfind /V ""ErrorLevel10
del "\path\to\the\file_s.ext" 2>&1 1> nul | find /V "" 1> nul 2>&1
但是,如果删除成功,如果没有成功,这将返回一个ErrorLevelof 。为了扭转这种行为,可以像这样附加一个/子句:10ifelse
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)