尝试删除(或覆盖)只读文件无法重定向“STDERR”

时间:2016-05-23 21:03:55

标签: batch-file windows-7 command-prompt

我有一个批处理文件,在某些时候可能必须删除文件(或覆盖现有文件)。我是这样做的标准方式:

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消息?

1 个答案:

答案 0 :(得分:4)

而不是2>&1 >nul,您应该使用>nul 2>&1。在说2>&1时,不要将其输出到默认输出,而是将错误输出重定向到默认输出的副本。但是,因为这会从左向右解释,所以首先将错误输出重定向到默认输出的副本,因此在屏幕上,然后将默认输出重定向到nul。