gpt4 book ai didi

powershell - 为什么cmdlet不使用控制台API?

转载 作者:行者123 更新时间:2023-12-04 17:07:47 24 4
gpt4 key购买 nike

根据MSDN for Strongly Encouraged Development Guidelines:

Cmdlets should not use the Console API.



为什么是这样?

如果我写 [Console]::Write("test"),它的效果和
Write-Host "test"

编辑:
众所周知,应避免使用 Write-Host。当MSDN说不使用控制台API时,是否可以安全地假设它们暗示我们也不应该使用 Write-Host,因为这在后台使用了控制台API?

最佳答案

您不应该使用与控制台相关的功能的主要原因是并非所有PowerShell主机环境都是控制台。

虽然典型的用例是在控制台中运行PowerShell,但是PowerShell不需要控制台,并且可以与不同类型的主机环境配合使用。

因此,为了使代码保持可移植性,不应假定存在控制台。

但是,假定存在主机(称为抽象)是安全的,PowerShell通过自动$HOST变量公开了该主机。
主机的功能有所不同,但却有所不同,即使不直接使用控制台API而是其PowerShell抽象Write-Host,历史上也会产生问题-参见下文。

PowerShell提供了托管API

with which the PowerShell runtime can be embedded inside other applications. These applications can then use PowerShell functionality to implement certain operations, including those exposed via the graphical interface.



https://en.wikipedia.org/wiki/PowerShell

因此,在Windows上使用控制台窗口主机(conhost.exe)的常规PowerShell控制台,仅是PowerShell主机的一种实现-PowerShell ISE是另一个示例,Microsoft Exchange Server管理GUI(2007+)也是如此。

至于Write-Host:

顾名思义,直到PSv4 为止,它 用于写入主机-可能不是控制台-因此 Write-Host实际上可能在不支持用户交互的主机上失败;参见 this question

从PSv5开始,可以安全地使用来使用 Write-Host,因为它现在可以写入新引入的独立于主机的信息流(编号 6)-请参见 Get-Help about_Redirection 和下一节。

请注意, Write-Host仍然会执行并且始终会在常规PowerShell输出流之外生成输出-它的输出是“注释”(反馈给用户)而不是数据。

虽然 Write-Host在PSv5 +中可以安全使用,但它存在是为了向后兼容,因此 可以考虑使用Write-Information -InformationAction Continue或在首选项变量Write-Information设置为$InformationPreference 的情况下使用 Continue,因为:
  • “Write-Host”现在有点用词不当,因为它实际上不再直接写入主机。
  • 为了向后兼容,
  • Write-Host不与$InformationPreference首选项变量集成-参见下文。
  • Write-Host仍提供受控制台启发的格式化参数(-ForegroundColor-BackgroundColor),并非所有主机(最终)都支持。


  • Write-HostWrite-Information:

    PetSerAl表示感谢,以帮助他进行以下工作。

    PSv5中引入的 Write-Information 是与新的独立于主机的信息流(编号 6)完全集成的cmdlet。
    值得注意的是, 现在可以通过使用Write-Information 重定向并捕获 Write-Host/ 6>输出,而PSv4-中的 Write-Host则无法实现。
    还要注意,即使使用 $InformationPreference的默认值 SilentlyContinue,该重定向也可以工作,该默认值仅控制显示,而不控制输出方面(仅使用公共(public)参数 -InformationAction Ignore才真正禁止写入流)。

    与PowerShell处理错误和警告的方式一致,可以通过新的 Write-Information首选项变量/新的公共(public) $InformationPreference cmdlet参数控制 -InformationAction的显示行为。
    Write-Information的默认行为是保持沉默- $InformationPreference默认为 SilentlyContinue

    请注意, Write-Information没有直接格式化参数[1],而是提供了带有 -Tags参数[2]的关键字标记


    相比之下,为了向后兼容, Write-Host的行为类似于Write-Information -InformationAction Continue ,即默认情况下为 输出,而使其静音的唯一方法是使用Write-Host -InformationAction Ignore [3]
    -它不遵循 $InformationPreferenceSilentlyContinue值(但是,它遵循其他值,例如 Inquire)。

    [1] PetSerAl指出,您可以将格式信息传递给 Write-Information,但只能以一种晦涩的方式传递,而PSv5.1甚至没有记录这种方式。例如。: Write-Information -MessageData ([System.Management.Automation.HostInformationMessage] @{Message='Message'; ForegroundColor='Red'}) -InformationAction Continue
    [2]请注意,参数名称“Tags”实际上是如何违反 strongly encouraged cmdlet development guidelines之一的:它应该是“Tag”(单数)。

    [3] PetSerAl解释说,这种行为源于 Write-Host,将 PSHOST标记传递给幕后的 Cmdlet.WriteInformation

    关于powershell - 为什么cmdlet不使用控制台API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40034278/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com