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

Duplicated HelpFiles (about_) prevent Get-Help to display information. How to fix it?

问题:我有两个about_psreadline帮助主题:about_psreadlineabout_PSReadLineGet-Help cmdlet 无法显示其中任何一个的信息。 Get-Help about_psreadline 只显示一个 table 和两个提到的帮助文件。

问题:如何处理重复的帮助文件? Could/Should 其中一个要删除?

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

每当 Get-Help 显示主题的 list 而不是请求的主题的 content - 尽管提供了特定主题的名称- 您可以调用.ToString()单个列表项以显示其内容;例如,显示第一项的内容:

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

向他们展示全部,一个接着一个:

Get-Help about_PSReadLine | ForEach-Object ToString

如您所见,重命名或删除重复文件可持久解决问题;请参阅下文了解如何找到它们。

但是,没有必要这样做,因为观察到的行为可能是 bug - 请参阅 this GitHub issue;详情如下。


适用于 PowerShell Core 6.2.0-rc.1

问题源于给定概念性帮助主题的多个版本可用,原因是:

  • 正在安装底层 PowerShell 模块的多个版本...

  • and/or - 对于 盒装 模块(PowerShell 附带的模块) - 预安装 即使安装了较新版本的内置模块后,帮助文件仍然可用。

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

注:

  • 多版本问题似乎只影响 概念性 帮助主题 (about_*),它们作为单独的 *.help.txt 文件实现。

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

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

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

我不清楚给定帮助主题的多个版本之间的确切优先规则/列表顺序;在 Windows PowerShell 中,与 powershell.exe 一起安装的概念性帮助主题版本似乎最先出现,但在 PowerShell Core 中似乎并非如此。


不幸的是,检查列表项的属性不会显示它们的源文件,只有它们的源文件的长度(大小以字节为单位) .

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

function Get-HelpFile($fileNamePart) { 
  # Note the use of Split-Path -Parent, because help files can be in sibling
  # folders of $env:PSModulePath folders.
  Split-Path -Parent ($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,它将在完整路径旁边列出文件大小(以字节为单位)(属性 .Length),这可以与大小相关联报告者,例如 Get-Help about_PSReadLine | Select Length,以推断列出主题的顺序。