重复的帮助文件 (about_) 阻止 Get-Help 显示信息。如何解决?
Duplicated HelpFiles (about_) prevent Get-Help to display information. How to fix it?
问题:我有两个about_psreadline帮助主题:about_psreadline 和 about_PSReadLine。 Get-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
,以推断列出主题的顺序。
问题:我有两个about_psreadline帮助主题:about_psreadline 和 about_PSReadLine。 Get-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
,以推断列出主题的顺序。