运行 help <command> 和管道输出到 Where-Object 或 Select-Object 返回空行

问题描述

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

奇怪的是,空行数表示 help firewall 在不调用管道到 Select-Object 的情况下会产生的行数

或者我正在尝试过滤 help firewall输出以仅返回名称以“Get”开头的行。运行 help firewall | Where-Object Name -like "Get" 只会返回任何内容

为什么这些帮助管道不起作用?它们在其他命令上运行良好。

Powershell 5.1 版并使用认的 Windows 控制台。

解决方法

用背景信息补充Zilog80's helpful answer

Get-Command help 表明 help 不是仅仅是 alias cmdlet 的 Get-Help,而是一个(内置)function(提交 $function:help 以查看其定义)。

如您所见:

  • while Get-Help 输出一个 object ([pscsustomobject]) 和 属性 反映帮助主题元数据,例如 {{1} },然后由 PowerShell 的输出格式系统呈现为显示文本,

  • Category 函数返回 strings - 表示呈现帮助主题的文本行流 - 必要性。

您可以通过管道连接到 Get-Member cmdlet 来观察输出类型的差异(helphelp firewall | Get-Member

Get-Help firewall | Get-Member 函数的目的是用 交互式分页 包裹 help,以便通过冗长的帮助主题方便地导航适合单个控制台(终端)屏幕。

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

注意:

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

  • 假设,cat 函数本身可以确定此条件,然后 (a) 不通过管道传输到分页程序,以及 (b) 按原样传递 help 的对象输出。[1] 但是,使用 PowerShell 代码从命令内部确定命令的输出目标甚至可能是不可能的。


[1] 当发现通过 Get-Help 定义的 custom 寻呼机是 PowerShell 命令而不是PowerShell 命令而不是一个外部程序。

,

在 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() }