有没有一种简短的方法可以写入主机并将其保存到变量中?

Is there a short way to Write-Host and save it to a variable?

我正在尝试 Write-Host 消息并以尽可能短的方式将其保存到 变量

目前我的代码是这样的:

Write-Host "Branch with name $branch_name already exists!`nNew branch has not been created."
$message = "Branch with name $branch_name already exists!`nNew branch has not been created."

当然可以。我做了一个特殊的函数来压缩这个:

function Write-Host-And-Save([string]$message)
{
Write-Host $message
return $message
}

$message = Write-Host-And-Save "Branch with name $branch_name already exists!`nNew branch has not been created."

但是它没有在屏幕上产生任何输出。更重要的是,我认为必须有比新功能更好的解决方案来做到这一点。 我试图找到一个。未成功。

Write-Host "Branch with name $branch_name already exists!`nNew branch has not been created." >> $message
Write-Host "Branch with name $branch_name already exists!`nNew branch has not been created." > $message
Write-Host "Branch with name $branch_name already exists!`nNew branch has not been created." -OutVariable $message

有什么方法可以使脚本短路吗?

您可以使用 Tee-Object 将其输入转发到管道中,并将其保存到变量(或文件,如果需要):

"Some message" | Tee-Object -Variable message | Write-Host

你也可以从Write-Host开始:

Write-Host "Some message" 6>&1 | Tee-Object -Variable message

6>&1Write-Host 写入(从 Powershell 5.0 开始)的信息流 (6) 重定向到标准输出流 (1)。您甚至可以使用 *>&1 来捕获所有流。

在这种情况下,最终输出最终会出现在常规输出流中,因此它不能准确回答您的问题。这只是一个示例,如何将 Tee-Object 用于捕获输出到变量的一般用例,同时仍将其输出到控制台(或管道下游的任何 cmdlet)。

在 PowerShell 5+ 上,您可以通过使用带有通用参数 -InformationVariableWrite-Host 来实现所需的行为。以下示例将字符串值存储在 $message.

Write-Host "Branch with name $branch_name already exists" -InformationVariable message

解释:

从 PowerShell 5 开始,Write-Host 成为 Write-Information 的包装器。这意味着 Write-Host 写入信息流。鉴于这种行为,您可以使用 -InformationVariable Common Parameter.

将其输出存储到一个变量中

或者,您可以使用成功流和公共参数 -OutVariable.

获得与 Write-Output 类似的结果
Write-Output "Branch with name $branch_name already exists" -OutVariable message

通常,我会赞成使用 Write-Output 而不是 Write-Host。它具有更同步的行为并使用成功流,这正是您打算在此处使用的。 Write-Host 确实提供了轻松为控制台输出着色的功能。