PowerShell:如何捕获(或抑制)写主机

KFL*_*KFL 4 powershell

我有一个脚本调用“ a.ps1”:

write-host "hello host"
"output object"
Run Code Online (Sandbox Code Playgroud)

我想调用脚本并获取输出对象,但我也希望取消标准输出:

$result = .\a.ps1
# Don't want anything printed to the console here
Run Code Online (Sandbox Code Playgroud)

有什么提示吗?

KFL*_*KFL 5

确实没有简单的方法可以做到这一点。

一种解决方法是通过定义一个具有相同名称的函数来覆盖Write-Host的默认行为:

function global:Write-Host() {}
Run Code Online (Sandbox Code Playgroud)

这是非常灵活的。它适用于我上面的简单示例。但是,由于某些未知的原因,它不适用于我想应用的实际情况(可能是因为被调用的脚本已签名,并且出于安全原因,它不允许调用者任意更改行为)。

我尝试的另一种方法是通过以下方式修改基础控制台的标准输出:

$stringWriter = New-Object System.IO.StringWriter
[System.Console]::SetOut($stringWriter)
[System.Console]::WriteLine("HI") # Outputs to $stringWriter
Write-Host("HI") # STILL OUTPUTS TO HOST :(
Run Code Online (Sandbox Code Playgroud)

但是如您所见,它仍然无法正常工作。