我有一个批处理文件,在某些时候可能必须删除文件(或覆盖现有文件)。我是这样做的标准方式:
c:\>del somefile
这(当文件是“只读”的情况)当然会导致错误消息:
Access is denied.
如果删除命令失败,我想通过检查删除后文件是否存在来测试删除是否成功。所以,我想将输出(STDOUT
)和错误输出(STDERR
)重定向到“nul”,然后在delete命令后使用“if file exists ...
”查看是否需要进一步的操作:
del somefile 2>&1 >nul
if exists somefile goto :someplace
问题是,STDERR
的重定向似乎失败了,因为我仍然收到错误消息:
c:\>del somefile 2>&1 >nul
Access is denied.
c:\>
无论是从批处理文件还是从命令提示符执行此操作,都会发生这种情况。
我知道我可以使用/F
的{{1}}(强制)开关来强制删除(并避免错误信息),如下所示:
del
但是,我失去了了解情况的能力,并在必要时采取其他行动(比如提示用户......)。此外,由于其他原因(例如文件正在使用),删除命令失败的可能性很小(很少),在这种情况下,我可能仍会看到c:\>del /F somefile 2>&1 >nul
c:\>
的重定向失败。
解决方法是使用STDERR
命令(在attrib
命令之前)检查文件的“只读”状态,但这有点涉及,可能最好使用“delete
”使用“REGEX
”或“grep
”之类的外部命令(仍然非常可行)。
“sed
”的这种行为是否已知,是否有某种原因它不被视为“错误”?
是否有某种方法可以强制“cmd.exe
”重定向此cmd.exe
消息?
答案 0 :(得分:4)
而不是2>&1 >nul
,您应该使用>nul 2>&1
。在说2>&1
时,不要将其输出到默认输出,而是将错误输出重定向到默认输出的副本。但是,因为这会从左向右解释,所以首先将错误输出重定向到默认输出的副本,因此在屏幕上,然后将仅默认输出重定向到nul。