Каждый раз, когда 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
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.2019PSModulePath
. Воспользуйтесь проводником Windows и выполните поиск по всему компьютеру*psreadline*.*
- person Ken White   schedule 12.03.2019PSModulePath
, поэтому я подумал об изменении местоположения, поскольку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