【问题标题】:Duplicated HelpFiles (about_) prevent Get-Help to display information. How to fix it?重复的帮助文件 (about_) 会阻止 Get-Help 显示信息。如何解决?
【发布时间】:2019-03-11 23:34:34
【问题描述】:

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

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

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

【问题讨论】:

  • 这种情况我已经发生过好几次了。解决方法是将 oldest 文件移动到其他位置。一旦我确认系统工作正常,我就删除了不需要的欺骗。 ///// 我不知道是什么原因造成的,寿。 [脸红]
  • 好的,但是我已经扫描了 $Env:PSModulePath 中的所有文件夹,并且那里只有一个名为 PSReadline 的模块。所以没有重复。这就是我搜索的方式: $Env:PSModulePath -split ';' | gci -递归 |其中 { $_.name -eq 'psreadline' }
  • 还有其他方法可以获取模块。 [grin] 如果它在 PoSh 路径之一中,你也会捡起它。我在模块目录中的C:\Windows\System32\WindowsPowerShell\v1.0\en-US 和各种EN-US 目录中有一组。 ///// 另外,它们有时命名不同。例如 about_Foreach-Parallel.help.txtabout_Foreach-Parallel.txt - 这两个都出现在搜索目录中。
  • 除了PSModulePath,您的计算机上还有其他位置。使用 Windows 资源管理器,在整个计算机中搜索 *psreadline*.*
  • 我认为 PowerShell 不会在 PSModulePath 中列出的位置以外的其他位置查找模块,所以我考虑更改位置,因为 Help 文件夹可能与 @987654331 处于同一级别@。以下行帮助找到了两个不同的 about_psreadline 帮助文件:$Env:PSModulePath -split ';' -replace 'Modules','' | gci -Recurse -Include '*about\_psreadline*' - 第二个 about_*..\Documents\Powershell\Help 中,我已将其重命名,瞧,get-help about_psreadline 有效! :)

标签: windows powershell powershell-core


【解决方案1】:

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

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

为了显示它们全部,一个接一个地显示:

Get-Help about_PSReadLine | ForEach-Object ToString

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

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


适用于 PowerShell Core 6.2.0-rc.1

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

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

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

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

注意:

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

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

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

  • 帮助主题可以作为给定模块的一部分提供,或者在内置模块的情况下,在与 PowerShell 可执行文件相同的文件夹中以语言命名的子文件夹中(例如,en-US)。
    至少在 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报告的大小相关联,所以以推断主题列出的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 2022-01-24
    • 1970-01-01
    • 2014-01-25
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多