如何解决运行 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 来观察输出类型的差异(help
与 help firewall | Get-Member
)
Get-Help firewall | Get-Member
函数的目的是用 交互式分页 包裹 help
,以便通过冗长的帮助主题方便地导航适合单个控制台(终端)屏幕。
此分页是通过外部程序提供的(默认情况下,Windows 上为 Get-Help
,类 Unix 平台上为 more.com
,可通过 less
进行配置,但仅在 PowerShell (Core) 7+) 中,并且由于 PowerShell 在与外部程序通信时仅“说文本”,$env:PAGER
必须发送 字符串流(显示行) 到他们,它通过Out-String
help
。
注意:
-
当外部分页程序发现它们的标准输出流没有连接到控制台(终端)时,它们除了简单地传递输入 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() }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。