2

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

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

或者我正在尝试过滤输出help firewall以仅返回名称以“Get”开头的行。运行help firewall | Where-Object Name -like "Get"什么也不返回。

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

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

4

2 回答 2

3

用背景信息补充Zilog80 的有用答案:

Get-Command help揭示了这help不仅仅是cmdlet别名Get-Help而是一个(内置)函数(提交$function:help以查看其定义)。

正如您自己所注意到的:

  • whileGet-Help输出具有反映帮助主题元数据的属性的对象( [pscsustomobject]),例如,然后由 PowerShell 的输出格式系统将其呈现为显示文本,Category

  • help函数返回字符串——代表呈现的帮助主题的文本行流——这是必要的。

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

help函数的目的是Get-Help使用交互式分页进行包装,以便在不适合单个控制台(终端)屏幕的冗长帮助主题中方便地导航。

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

笔记:

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

  • 假设,help函数本身可以确定这个条件,然后(a)不管道到分页程序和(b)按Get-Help原样中继对象输出。[1]但是,使用 PowerShell 代码从命令内部确定命令的输出目标甚至是不可能的。


[1] 当发现通过定义的自定义寻呼机是PowerShell命令而不是外部程序时,该函数实际上已经采取了此操作。$env:PAGER

于 2021-05-26T13:47:22.720 回答
2

help help检查来自PowerShell的反馈:

    你也可以输入 `help` 或 `man`,它会显示一个屏幕的文本
    时间。或者,`-?`,与 `Get-Help` 相同,但仅
    适用于 cmdlet。

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

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

要查看发生了什么,请检查以下的不同输出:

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

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

而且,对于 cmdlet,

Select-Object -? | %{ $_.gettype() }
于 2021-05-26T13:20:38.840 回答