Kas*_*uza 4 windows powershell powershell-core
问题:我有两个about_psreadline帮助主题:about_psreadline和about_PSReadLine。Get-Help cmdlet 无法显示其中任何一个的信息。Get-Help about_psreadline只显示一个包含两个提到的帮助文件的表格。
问题:如何处理重复的帮助文件?可以/应该删除其中之一吗?
Powershell 版本:6.1.3;我还检查了PSModulePath并且包含PSReadline的唯一路径是C:\program files\powershell\6\Modules
每当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 附带的模块)的情况下 -即使安装了较新版本的内置模块,预安装的帮助文件仍然可用。
笔记:
在多版本问题似乎只影响概念性帮助主题(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,以便推断列出主题的顺序.