重复的HelpFiles(about_)阻止Get-Help显示信息。如何解决?

时间:2019-03-11 23:34:35

标签: windows powershell powershell-core

问题::我有两个 about_psreadline 帮助主题: about_psreadline about_PSReadLine Get-Help cmdlet无法显示其中任何一个的信息。 获取帮助 about_psreadline 只会显示一个包含两个提及的帮助文件的表。

问题:如何处理重复的HelpFile?可以/应该删除其中之一吗?

Powershell版本:6.1.3;我还检查了 PSModulePath ,唯一包含 PSReadline 的路径是 C:\ program files \ powershell \ 6 \ Modules

enter image description here

1 个答案:

答案 0 :(得分:2)

只要Get-Help显示主题的列表而不是所请求主题的内容-尽管提供了特定主题的名称,您仍可以呼叫{ {1}}在各个列表项上以显示其内容;例如,显示第一项的内容:

.ToString()

要向他们展示 all ,一个紧接着另一个:

(Get-Help about_PSReadLine)[0].ToString()

您已经发现,重命名或删除重复的文件可以持久解决该问题;有关如何查找的信息,请参见下文。

但是,不必这样做,因为观察到的行为很可能是 bug -参见this GitHub issue;详细信息。


自PowerShell Core 6.2.0-rc.1起适用

问题源自给定概念帮助主题的多个版本,原因如下:

  • 正在安装的基础PowerShell模块的多个版本...

  • 和/或-对于内置模块(PowerShell附带的模块)-预安装帮助文件即使在更新之后也仍然可用版本的内置模块已安装。

    • 从Windows PowerShell v5.1 / PowerShell Core 6.2.0开始,这仅是一部分内置模块(PSReadLine,Microsoft.PowerShell.Archive,PackageManagement,PowerShellGet)的选项。

注意:

  • 多版本问题似乎仅影响概念帮助主题(Get-Help about_PSReadLine | ForEach-Object ToString ,这些主题是单独实现的about_*文件。

    • 相比之下,给定模块的 cmdlet 的帮助主题通常作为单个MAML文件(名称包含模块名称的*.help.txt文件)的一部分提供;仅此类主题的一个版本被认为是最新版本,因此其内容直接显示(没有列出多个版本)。

    • 有鉴于此,具有多个概念性帮助主题的不同且晦涩的行为很可能是 bug ,尤其是鉴于您无法分辨出哪个版本列出的项目与;在相关说明中,对于非概念性主题,目前无法查看其他版本的帮助,这似乎是设计限制

  • 帮助主题可以作为给定模块的一部分提供,或者对于内置模块,可以在与PowerShell相同的文件夹中以该语言命名的子文件夹(例如*-help.xml)中提供可执行文件。
    至少在PowerShell Core中,按需安装的模块似乎还可以将主题放置在en-US文件夹中的Help文件夹中,该文件夹是其他文件夹的同级文件夹。在这些$env:PSModulePath文件夹中,概念帮助主题似乎可以出现在顶层(特定于语言的文件夹中)和为模块命名的子文件夹中(特定于语言的文件夹中)- 我不清楚其背后的逻辑

我不清楚给定帮助主题的多个版本中的确切优先顺序规则/列出顺序;在Windows PowerShell中,似乎首先出现在Help旁边的概念性帮助主题版本,但在PowerShell Core中似乎并非如此。


不幸的是,检查列表项的属性不会显示其源文件,只会显示其源文件的 length (以字节为单位)。

但是,您可以独立定位帮助文件:以下 helper函数(功能更全的版本可以从this Gist下载)您可以使用自己的命令来查找给定概念性帮助主题或模块名称的所有帮助文件:

powershell.exe

您可以传递帮助文件名中包含的任何子字符串,例如模块名,例如function Get-HelpFile($fileNamePart) { Split-Path ($env:PSModulePath -split [IO.Path]::PathSeparator) | Get-ChildItem -File -Recurse -Filter *$fileNamePart* | Where-Object Name -match '(?:\.help\.txt|-help.xml)$' } # Find help source files whose name contains 'about_psreadline' Get-HelpFile about_psreadline ,但请注意,鉴于概念性帮助主题不一定包含与之关联的模块名称,因此不一定显示与该模块相关的所有帮助文件。 。
另外,某些模块名称未反映在其帮助文件名称中,尤其是模块PSReadLine(帮助文件名为Microsoft.PowerShell.Core)和System.Management.Automation.dll-Help.xml(帮助文件名为Microsoft.PowerShell.Management

如果将上述命令传递给Microsoft.PowerShell.Commands.Management.dll-Help.xml,它将在完整路径旁边列出以字节为单位的文件大小(属性| Select FullName, Length),该文件大小可以与{ {1}},以推断主题的列出顺序。