Дублированные файлы справки (about_) не позволяют Get-Help отображать информацию.Как это исправить? - PullRequest
2 голосов
/ 12 марта 2019

Проблема: У меня есть две about_psreadline разделы справки: about_psreadline и about_PSReadLine . Get-Help Командлет не может отображать информацию ни по одному из них. Get-Help about_psreadline просто отображает таблицу с двумя упомянутыми файлами справки.

Вопрос: Как обращаться с дублированными файлами справки?Может / должен быть удален один из них?

Версия Powershell : 6.1.3;Я также проверил PSModulePath и единственный путь, содержащий PSReadline , равен C: \ program files \ powershell \ 6 \ Modules

enter image description here

1 Ответ

2 голосов
/ 12 марта 2019

Всякий раз, когда Get-Help показывает список тем, а не содержание запрошенной темы - несмотря на то, что вы указали название конкретной темы - вы можете позвонить .ToString() на отдельные элементы списка для отображения их содержимого ; например, чтобы показать содержимое 1-го элемента:

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

Чтобы показать их все , один за другим:

Get-Help about_PSReadLine | ForEach-Object ToString

Как вы обнаружили, переименование или удаление дубликатов файлов решает проблему постоянно; см. ниже о том, как их найти.

Однако делать это не нужно, поскольку наблюдаемое поведение, скорее всего, ошибка - см. эту проблему 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 файлов.

    • Напротив, разделы справки для командлетов данного модуля обычно доставляются как часть одного файла MAML (*-help.xml файл, имя которого содержит имя модуля); только когда-либо одна версия таких тем считается текущей и, следовательно, ее содержимое отображается напрямую (нет списка нескольких версий).

    • В свете этого различающееся и неясное поведение с несколькими концептуальными разделами справки вероятно ошибка , особенно учитывая, что вы не можете сказать, какие версии перечислены предметы связаны с; на связанной ноте, для не концептуальных тем, * в настоящее время нет способа просмотреть справку других версий , которая выглядит как ограничение дизайна .

  • Разделы справки могут быть доставлены как часть данного модуля или, в случае встроенных модулей, в подпапках, названных для языка (например, en-US), в той же папке, что и исполняемый файл PowerShell.
    По крайней мере, в PowerShell Core установленные модули по требованию, по-видимому, также могут помещать разделы в папки Help, которые являются аналогичными папками других папок, перечисленных в $env:PSModulePath; в этих Help папках концептуальные разделы справки, по-видимому, могут присутствовать как на верхнем уровне (в папках для конкретного языка), так и во вложенных папках, названных для модулей (в папках для конкретного языка) - Мне неясно, какая логика стоит за этим .

Мне неясно, каковы точные правила приоритета / порядок листинга среди нескольких версий данной справочной темы; в Windows PowerShell версия концептуальной справки, установленная вместе с powershell.exe, кажется на первом месте, но в PowerShell Core это не так.


К сожалению, проверка свойств элементов списка не обнаруживает их исходный файл , только длина их исходного файла длина (размер в байтах).

Однако вы можете самостоятельно находить файлы справки : следующую вспомогательную функцию (более полнофункциональную версию которой можно загрузить из this Gist ) основывается на вашей собственной команде для поиска всех файлов справки по заданной концептуальной теме справки или имени модуля:

function Get-HelpFile($fileNamePart) { 
  Split-Path ($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, поэтому как сделать вывод о порядке перечисления тем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...