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

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

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

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

введите описание изображения здесь


person Kasia Gauza    schedule 11.03.2019    source источник
comment
у меня такое случалось несколько раз. исправление заключалось в перемещении самого старого файла в другое место. как только я подтвердил, что система работает, я удалил ненужный обман. ///// я не знаю, чем это вызвано, но. [румянец]   -  person Lee_Dailey    schedule 12.03.2019
comment
Хорошо, но я просканировал все папки из $ Env: PSModulePath, и там есть только один модуль с именем PSReadline. Так что никаких дубликатов. Вот как я искал: $ Env: PSModulePath -split ';' | gci -Recurse | где {$ _. name -eq 'psreadline'}   -  person Kasia Gauza    schedule 12.03.2019
comment
есть и другие способы подобрать модули. [ухмылка], если он находится на одном из путей PoSh, вы также его подберете. у меня был набор в C:\Windows\System32\WindowsPowerShell\v1.0\en-US & в различных EN-US каталогах в каталоге модулей. ///// плюс, иногда их называют иначе. например about_Foreach-Parallel.help.txt & about_Foreach-Parallel.txt - оба они появились, когда были в каталогах поиска.   -  person Lee_Dailey    schedule 12.03.2019
comment
На вашем компьютере есть другие места, кроме PSModulePath. Воспользуйтесь проводником Windows и выполните поиск по всему компьютеру *psreadline*.*   -  person Ken White    schedule 12.03.2019
comment
Я не думаю, что PowerShell ищет модули в других местах, кроме перечисленных в PSModulePath, поэтому я подумал об изменении местоположения, поскольку Help папки могут находиться на том же уровне, что и Modules. Следующая строка помогла найти два разных about_psreadline файла справки: $Env:PSModulePath -split ';' -replace 'Modules','' | gci -Recurse -Include '*about\_psreadline*' - второй about_* был в ..\Documents\Powershell\Help, я его переименовал и вуаля, get-help about_psreadline работает! :)   -  person Kasia Gauza    schedule 12.03.2019


Ответы (1)


Каждый раз, когда 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) - предустановленные файлы справки по-прежнему будут доступны даже после выхода новых версий встроенных модулей были установлены.

    • As of Windows PowerShell v5.1 / PowerShell Core 6.2.0, this is only an option for a subset of the in-box modules (PSReadLine, Microsoft.PowerShell.Archive, PackageManagement, PowerShellGet).

Примечание:

  • Проблема с несколькими версиями, похоже, затрагивает только концептуальные разделы справки (about_*), которые реализованы в виде отдельных *.help.txt файлов.

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

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

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

Мне неясен точный порядок приоритета правил / порядка перечисления среди нескольких версий данного раздела справки; в 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, чтобы определить порядок, в котором темы перечисляются.

person mklement0    schedule 12.03.2019