如何将 Powershell 命令静音?

4

我在编写一段脚本,需要调用一系列嘈杂的其他cmdlet。为了只看到自己脚本的状态消息,我希望不显示其他cmdlet的输出信息。

我尝试过使用 > $null| Out-Null 命令,但这些命令只能隐藏返回值,无法隐藏通过Write-Host打印的文本。有什么方法可以隐藏/阻止“向下堆栈”打印文本吗?


避免使用 Write-Host 是很困难的,但你可以通过将这些 cmdlet 作为作业运行来实现。作业将是一个单独的主机进程,因此没有输出。 $Job = Start-Job -Scriptblock {Noisy-Cmdlet};Wait-Job $Job - TheMadTechnician
&{Make-Noise} *> $null - Mathias R. Jessen
除非运行生成输出的代码的进程不同(这样Windows才会将控制台输出合并回该进程的STDOUT),否则无法重定向Write-Host输出。 - Ansgar Wiechers
2个回答

3

尝试在调用吵闹的 cmdlets 之前定义您的虚拟函数 Write-Host,例如:

    function Write-Host {}

如果他们直接调用Write-Host,那么这应该会有所帮助。

有没有办法“取消定义”我的后续操作? - Benjin
1
Remove-Item function:Write-Host - Roman Kuzmin

2
如果我理解您的帖子正确,您想要将Write-Host命令静音。如果我们考虑命令优先级,我们知道如果函数与cmdlet有相同的名称,那么函数将在cmdlet之前运行。因此,我建议您创建一个不输出任何内容的Write-Host函数。以下是一个突出显示这种可能性的示例。

enter image description here


这会有效地使所有输出静音,对吗?我的脚本仍然会打印我想要看到的东西。我该如何解决这个问题?是否可以为当前的Write-Host设置一个新名称,然后用一个虚拟的名称覆盖它? - Benjin
你应该尽量避免使用Write-Host。对于不想要被静音的内容,请使用Write-Output -InputObject <Your Message Here>。或者,按照我的不良建议,可以这样使用Write-Host以便查看它:Microsoft.PowerShell.Utility\Write-Host -Object <Your Message Here>。命令优先级不会删除原始的Write-Host cmdlet。它只是运行同名函数而不是cmdlet。如果您添加模块名称和反斜杠,仍然可以使用它,就像我上面演示的那样。 - tommymaynard
很酷,我喜欢那种方法。它对于一些写入控制台的操作有效,但其他操作似乎来自于cmdlets中DLLs的Console.WriteLine()。我该怎么办? - Benjin
好的,我刚刚发现了System.Console.SetOut(),它解决了那个问题。谢谢! - Benjin

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