运行 帮助 <command> 和管道输出到 Where-Object 或 Select-Object returns 空行

Running help <command> and piping output to Where-Object or Select-Object returns empty rows

运行 命令 help firewall | Select-Object Category。结果是一栏空白 Category.

奇怪的是,空行数表示 help firewall 在不调用管道传输到 Select-Object

的情况下会产生的行数

或者我正在尝试将 help firewall 的输出过滤为 return 只有名称以“Get”开头的行。 运行 help firewall | Where-Object Name -like "Get" 只是 return 没什么。

为什么这些管道没有帮助工作?他们在其他命令上工作得很好。

Powershell 版本 5.1 并使用默认 windows 控制台。

在 PowerShell 中查看 help help 的反馈:

    You can also type `help` or `man`, which displays one screen of text at a
    time. Or, ` -?`, that is identical to `Get-Help`, but only
    works for cmdlets.

help命令显示“文本屏幕”,这意味着它正在输出 [System.String] 个对象,而不是 [PSCustomObject] 个对象。

只有 -? 的行为与 Get-help 相同,并且会提供 [PSCustomObject] 个对象。

要查看发生了什么,请检查来自 :

的不同输出
help firewall | %{ $_.GetType() }

Get-help firewall | %{ $_.GetType() }

并且,对于 cmdlet,

Select-Object -? | %{ $_.gettype() }

用背景信息补充

Get-Command help reveals that help is not a mere alias of the Get-Help cmdlet, but a (built-in) function(提交$function:help查看其定义)。

如您所见:

  • while Get-Help 输出一个 object ([pscsustomobject]) with properties 反映帮助主题元数据,例如 Category,然后由 PowerShell 的输出格式化系统呈现 作为显示文本,

  • help 函数 returns strings - 表示 呈现的 [=89] 的文本行流=]帮助主题-必要的。

您可以通过管道传输到 Get-Member cmdlet(help firewall | Get-MemberGet-Help firewall | Get-Member

来观察输出类型的差异

help功能的目的是用交互式分页包装Get-Help,方便浏览不适合单个控制台(终端)屏幕的冗长帮助主题。

此分页是通过 外部程序 提供的(默认情况下,Windows 上的 more.com 和类 Unix 平台上的 less ,可通过 $env:PAGER 配置,但仅在 PowerShell (Core) 7+) 中,并且 因为 PowerShell 在与外部程序通信时仅“说文本”,help 必须向他们发送 字符串 (用于显示的行) 流,这是通过
Out-String -Stream.

注:

  • 当外部分页程序发现它们的标准输出流没有连接到控制台(终端) ,除了简单地传递输入 之外,它们不采取任何行动(在 Unix 术语中,它们的行为类似于 cat)。

  • 假设,help 函数本身可以确定这种情况,然后 (a) 不通过管道传递给分页程序,并且 (b) 将 Get-Help 的对象输出中继为-is.[1] 但是,使用 PowerShell 代码从命令内部确定命令的输出目标甚至可能是不可能的。


[1] 当发现通过 $env:PAGER 定义的 custom 传呼机是 PowerShell 命令而不是外部程序。