批处理脚本:为什么不redirectstdout在这种情况下工作?

如果你打开一个命令提示符并input:

echo foobar > nul 

它将不会打印任何东西,因为nul吞下所有的input。 但是,如果您使用PowerShell运行该命令:

 powershell "echo foobar" > nul 

它会输出foobar到控制台。 为什么是这样,我能做些什么来解决它?

编辑: 这是$PSVersionTable的输出。 看起来我正在使用PowerShell v5.0。

注意:我假设你正在从cmd.exe中调用你的命令,而不是在PowerShell中,这与我所看到的症状是一致的。

你偶然发现PS(PowerShell)v5中的一个bug v3中不存在;对这个问题的评论表明它也不在v4中),尽管我不完全理解为什么PS会被指责,因为我期望cmd.exe来处理重定向。
我可能会错过一些东西,所以请让我知道。

PowerShell 应该发送所谓的成功流 – 默认情况下输出的东西,包括echo ,这是Write-Output的别名 – 到外部世界的标准输出

在较老的PS版本中>NUL确实有效地抑制了PowerShell的输出。
奇怪的是, v5中bug只影响NUL ,而重定向到实际的文件。

至于解决方法

如果您的代码与v2兼容 ,请尝试以下操作:

 powershell -version 2 "echo foobar" > NUL 

否则, 重定向到一个实际的文件,然后删除该文件:

 powershell "echo foobar" > "%TEMP%\NUL-bug-workaround" & del "%TEMP%\NUL-bug-workaround"