当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 了解 PowerShell 写入主机 Cmdlet

作者:精品下载站 日期:2024-12-14 13:03:30 浏览:14 分类:玩电脑

了解 PowerShell 写入主机 Cmdlet


多年来,围绕 PowerShell Write-Host cmdlet 是否需要使用它存在很多争论。与大多数情况一样,答案是可能的,并且取决于您的需求。

要了解 Write-Host 以及何时使用它,让我们快速探索 Write-Host 的历史,并了解如何最好地使用这个有用的 cmdlet。

PowerShell Write-Host 的现代使用

通常,在脚本或 PowerShell 函数中,您需要将有关正在发生的情况的信息转换为用户,这些信息是信息性的且与函数的输出不直接相关。

为什么我们说现代使用Write-Host?在 PowerShell 5.x 之前,Write-Host 未绑定到流(例如成功、错误或警告流)。因此不鼓励使用它,因为它不像其他输出类型那样可控。

让我们以这个简单的脚本示例为例,它向用户提供一些有关脚本处理时间的信息。

Write-Host "Starting the gathering of information, be patient, this could take a while!"
Write-Host "- Gathering Process`r`n- Gathering Files`r`n- Gathering Users"
Write-Output "Display the information here..."
Write-Host "Information Gathering Complete!"

[玩转系统] 了解 PowerShell 写入主机 Cmdlet

您会注意到,这只是将信息输出到主机,脚本的最终用户可以利用这些信息做出进一步的决策。您可能会发现自己在询问管道内容。

如果您将对象从一个 cmdlet 或函数发送到另一个 cmdlet 或函数,但仍想显示信息性消息,您可以这样做吗?值得庆幸的是,PowerShell 的 Write-Host cmdlet 不会影响管道输出!下面让我们展示一下它是如何工作的。

Function Get-Information {
  Write-Host "Starting the gathering of information, be patient, this could take a while!`r`n"
  Write-Host "- Gathering Data`r`n- Returning Data`r`n"

  [PSCustomObject]@{
    "Test1" = "Value1"
    "Test2" = "Value2"
  }

  Write-Host "Information Gathering Complete!"
}

Function Convert-Information {
  Param(
    [Parameter(ValueFromPipeline=$true)]$Param
  )

  $Param | ConvertTo-JSON
}

如果将 Get-Information 的输出通过管道传输到 Convert-Information,它将不会考虑任何语句,并且仅对 PSCustomObject 进行操作> 即输出。

[玩转系统] 了解 PowerShell 写入主机 Cmdlet

设置消息格式以提高可读性

Write-Host 的另一个非常有用的方面是格式化颜色和输出的能力。由于这可以提高可读性,因此可以极大地帮助 PowerShell 脚本用户了解正在发生的情况以及何时需要采取操作。

  • -ForegroundColor - 信息文本的颜色。
  • -BackgroundColor - 文本后面的背景颜色。
  • -Separator - 对于输出 Write-Host 的对象,请使用提供的分隔符而不是空格。这可以是回车符和换行符,例如 "rn"
  • -NoNewLine - 不要在输出末尾输出换行符。

让我们探讨如何利用各种格式参数构建有用的信息消息。在下面的代码中,我们正在构造一条有关数组结果数量的信息消息,并应用格式设置以使其更易于查看。

可以将多个对象传递给 Write-Host 来显示,如下所示。通常,脚本编写者会用空格分隔这些消息,但使用分隔符参数,您可以控制这些消息如何输出到控制台。

$Array = @(1,2,3,4,5)

Write-Host "Results Count:" -BackgroundColor DarkBlue -ForegroundColor White -NoNewline
Write-Host "" $Array.Count "Items`r`n" -ForegroundColor Red
Write-Host $Array -Separator "`r`n"
Write-Host "" "End of results." -ForegroundColor Green -Separator "`r`n"

[玩转系统] 了解 PowerShell 写入主机 Cmdlet

通过使用颜色、换行符和分隔符输出控制输出,我们可以制作一条有用的消息,向用户提供有关脚本的信息。此场景的一个示例是当您创建信息菜单以及其他用例时。

重定向 Write-Host 流输出

由于 Write-Host 现在可以通过流输出进行控制,因此有几种方法可以控制和重定向输出。 InformationAction 首选项在一定程度上与 Write-Host 消息一起考虑。 -InformationAction Ignore 将有效抑制 Write-Host 消息,但 $InformationPreferenceInformationAction 参数不会影响Write-Host cmdlet。

您是否知道 Write-Host 只是 Write-Information cmdlet 的包装器?这使得Write-Host 的输出能够包含在信息流中。这意味着您可以使用信息流修改 Write-Host 消息的去向。

话虽这么说,您仍然可以使用重定向运算符将 Write-Host 消息的输出重定向到不同的流。例如,将所有 Write-Host 消息输出到日志文件。采用与上面相同的示例,让我们将所有输出重定向到日志文件。

Write-Host "Results Count:" -BackgroundColor DarkBlue -ForegroundColor White -NoNewline 6>> .\log.txt
Write-Host "" $Array.Count "Items`r`n" -ForegroundColor Red 6>> .\log.txt
Write-Host $Array -Separator "`r`n" 6>> .\log.txt
Write-Host "" "End of results." -ForegroundColor Green -Separator "`r`n" 6>> .\log.txt

[玩转系统] 了解 PowerShell 写入主机 Cmdlet

如您所见,PowerShell 现在将输出重定向到日志,但格式可能不完全符合您的预期。这是因为 -NoNewLine 参数并没有得到真正的尊重,因为它主要是一个主机格式化工具。这可能不是什么大问题,但在重定向流输出时需要记住这一点。

结论

随着 PowerShell 5.x 及更高版本的更改,当您需要向用户显示信息性消息时,完全允许使用并鼓励使用 Write-Host。由于 PowerShell 用户对信息性消息具有与输出或详细消息相同的必要级别的控制,因此鼓励使用 Write-HostWrite-Information并建议在必要时使用。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯