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

Kas*_*uza 4 windows powershell powershell-core

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

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

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

在此处输入图片说明

mkl*_*nt0 5

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

(Get-Help about_PSReadLine)[0].ToString()
Run Code Online (Sandbox Code Playgroud)

向他们展示一切,一个直接前一后:

Get-Help about_PSReadLine | ForEach-Object ToString
Run Code Online (Sandbox Code Playgroud)

正如您所发现的,重命名或删除重复文件可以持续解决问题;请参阅下文了解如何找到它们。

但是,这样做不是必要的,因为观察到的行为可能是一个错误- 请参阅此 GitHub 问题;详情如下。


适用于 PowerShell Core 6.2.0-rc.1

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

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

  • 和/或 - 在内置模块(PowerShell 附带的模块)的情况下 -即使安装了较新版本的内置模块,预安装的帮助文件仍然可用。

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

笔记:

  • 多版本问题似乎只影响概念性帮助主题(about_*,其被实现为单个*.help.txt文件。

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

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

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

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


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

但是,您可以独立定位帮助文件:以下帮助函数(可以从此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
Run Code Online (Sandbox Code Playgroud)

您可以传递包含在帮助文件名中的任何子字符串,例如模块名称,例如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,以便推断列出主题的顺序.