运行 帮助 <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-Member
与 Get-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 命令而不是外部程序。
运行 命令 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-Member
与 Get-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 命令而不是外部程序。