如何抑制非PowerShell命令的输出?

33

我正在运行一个命令

hg st

然后检查它的$LASTEXITCODE以检查当前目录中是否有mercurial可用。我不关心它的输出,也不想向用户显示它。

我如何抑制所有输出,无论成功或错误?

由于mercurial不是PowerShell命令,hg st | Out-Null无效。

3个回答

64

Out-Null 能够很好地处理非 PowerShell 命令。但是,它不能抑制 STDERR 上的输出,只能抑制 STDOUT 上的输出。如果你想在管道输出到 Out-Null 之前也抑制 STDERR 输出,你必须将该文件描述符重定向到 STDOUT

hg st 2>&1 | Out-Null

2>将所有的输出从STDERR(文件描述符#2)重定向。 &1将被重定向的输出与STDOUT(文件描述符#1)的输出合并。 然后将组合的输出从STDOUT打印出来,管道可以将其馈送到pipline中的下一个命令的STDIN中(在本例中为Out-Null)。 有关更多信息,请参见Get-Help about_Redirection


太棒了。它有效了。你能解释一下 2>&1 语法实际上是什么意思吗? - George Mauer
1
2>&1 的意思是“将标准错误重定向到与标准输出相同的位置”。 - Bill_Stewart
@Bill_Stewart 我相信这就是我说的,只不过我单独处理了操作符的两个部分,因为其他流也可以与STDOUT(实际上是成功输出流)合并。 - Ansgar Wiechers
@AnsgarWiechers - 当然。我没有注意到在George Mauer要求澄清之后,您已经修改了您的答案。 - Bill_Stewart

10

一个有趣的事情是将输出导入Write-Verbose,这样,如果需要,在使用脚本时可以通过-Verbose开关仍然查看它。

ping -n 2 $APP 2>&1 | Write-Verbose

7

例如,如果未安装hg,这将不会抑制STDERR。 - George Mauer
@GeorgeMauer 我的建议也不行。主机环境抛出的错误不会被重定向。 - Ansgar Wiechers
1
请注意,在 PowerShell v3 之前,*> 重定向运算符不可用。 - Ansgar Wiechers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接