Почему мой псевдоним не дает мне получить помощь или -? - PullRequest
1 голос
/ 26 мая 2020

Это PS5.1

У меня есть псевдоним «pro c», который указывает на специальный сценарий c на моем компьютере, который я настроил с помощью следующей команды

Set-Alias -Name proc     -Value "$sourceCodePath\deploy\Invoke-Process.ps1"           -Scope Global

Если я сделаю

proc -?

или

get-help proc

, я получу какой-то результат поиска, как будто я недостаточно c указал, когда мне просто нужно страница справки

> proc -?

Name                              Category  Module                    Synopsis 
----                              --------  ------                    --------          
proc                              Alias                               Invoke-Process.ps1
Enter-PSHostProcess               Cmdlet    Microsoft.PowerShell.Core Connects to and enters into an interactive session with a local process.  
Exit-PSHostProcess                Cmdlet    Microsoft.PowerShell.Core Closes an interactive session with a local process.                       
Get-PSHostProcessInfo             Cmdlet    Microsoft.PowerShell.Core                                                                           
etc...

Хорошо, это документированное поведение Get-Help, поэтому, чтобы сузить его, я пробую

Get-Help -Category alias -Name proc -Full

, и это просто возвращает один элемент снова без какой-либо фактической справочной информации ?

Name          : proc
Category      : Alias
Synopsis      : Invoke-Process.ps1
Component     :
Role          :
Functionality :

Кто-нибудь знает, почему это происходит, и могу ли я что-нибудь сделать, чтобы мой псевдоним вел себя как первоклассный гражданин PowerShell, не создавая для этого модуль или что-то более тяжелое?

Кстати, это работает

& ((get-alias proc).ReferencedCommand.Source) -?

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

Спасибо за любую помощь!

1 Ответ

2 голосов
/ 27 мая 2020

В основном причина этого вывода состоит в том, что Get-Help возвращает справочную информацию о псевдониме , а не о фактическом файле , на который есть ссылка.

Уровень 0 - TL; DR

Если вы просто хотите вернуть базовую информацию c скрипта, вам понадобится небольшая функция в скрипте вашего профиля, чтобы:

  1. Получить псевдоним
  2. Определить местоположение исходного файла сценария
  3. Передать информацию о местоположении этого файла в Get-Help
  4. Бонус: сделайте его также псевдонимом!

Например

Function Get-HelpAlias($alias){
    Get-Help((Get-Alias $alias).ResolvedCommand.Source)
} 

Set-Alias -Name gha -Value Get-HelpAlias

PS C:\> gha proc
Invoke-Process.ps1 [par1] [par2]

Уровень 1 - Справка по файлу сценария

Давайте разберем, что происходит:

Когда вы запустили:

Get-Help proc

Действительно, вы видите результаты поиска, так как "pro c" недостаточно уникальна для Get-Help, чтобы однозначно идентифицировать то, что вы ищете. Указав категорию:

Get-Help proc -Category Alias

Вы получаете один результат. Вы можете увидеть это, если выбрали более «уникальный» псевдоним:

PS C:\> Set-Alias -Name zzzzzz -Value "$sourceCodePath\deploy\Invoke-Process.ps1" 
PS C:\> Get-Help zzzzzz

Name          : zzzzzz
Category      : Alias
Synopsis      : \deploy\Invoke-Process.ps1
Component     :
Role          :
Functionality :

Что касается того, что он возвращает, он возвращает справочную информацию о псевдониме . Вы можете ясно видеть, что это Категория - это Псевдоним, а возвращенная информация - это значение, содержащееся в Псевдониме. Вы можете увидеть, что здесь:

PS C:\Temp> Get-Alias proc

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           proc -> \deploy\Invoke-Process.ps1

Мы можем «подделать» вещи, получив псевдоним, посмотрев, что это за сценарий, на который есть ссылка, и передав строку ссылки на сценарий в Get-Help:

Get-Help((Get-Alias proc).ResolvedCommand.Source)

Если это все, что вы хотите сделать, то вы можете также добавить функцию в сценарий вашего профиля (с псевдонимом, конечно ;-), которая делает это для любого псевдонима сценария, на который вы хотите ссылаться, например:

Function Get-HelpAlias($alias){
    Get-Help((Get-Alias $alias).ResolvedCommand.Source)
} 

Set-Alias -Name gha -Value Get-HelpAlias

PS C:\> gha proc
Invoke-Process.ps1 [par1] [par2]

Это TL; DR уровня 1, и он будет работать, если вы просто хотите получить информацию о базовом c скрипте.

Теперь переходим на уровень 2.

Уровень 2 - Фактическая справка

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

Если мы на самом деле написали справочную информацию, мы получим очень другой результат. Хорошая новость заключается в том, что при написании справочной информации PowerShell это Very Easy , и вам не нужно быть «первоклассным» гражданином PowerShell, чтобы сделать это.

Самый простой способ создать справку Информацию нужно написать Справка на основе комментариев . Например, Чтобы написать Справку на основе комментариев для сценария в верхней части сценария, просто добавьте что-то вроде этого:

<#
.SYNOPSIS
    Invoke-Process runs programs
.DESCRIPTION
    Connects to array of computers provided, and runs scripts.
#>


param (
    [string]$param1,
    [string]$param2
)
......

Это простой способ добавить справку к сценарию. Тогда ваш результат (с использованием функции выше) будет выглядеть так:

PS C:\> Get-Help .\Invoke-Process.ps1

NAME
    C:\Invoke-Process.ps1

SYNOPSIS
    Invoke-Process runs programs


SYNTAX
    C:\Invoke-Process.ps1 [[-param1] <String>] [[-param2] <String>] [<CommonParameters>]


DESCRIPTION
    Connects to array of computers provided, and runs scripts.


RELATED LINKS

REMARKS
    To see the examples, type: "get-help C:\Temp\asdf.ps1 -examples".
    For more information, type: "get-help C:\Temp\asdf.ps1 -detailed".
    For technical information, type: "get-help C:\Temp\asdf.ps1 -full".

Уровень 3 - Заставить его работать так, как должно

А как насчет командлетов? что с ними происходит? например, что произойдет, если мы передадим псевдоним gci в Get-Help?

PS C:\> Get-Help gci

NAME
    Get-ChildItem

SYNTAX
.... 

Ну, это другое. Этот псевдоним не возвращается так же, как то, что произошло выше. Это действительно работает так, как я хочу. Почему мой не сделал этого ???

Это подчеркивает разницу между функциями и скриптами . В приведенных выше примерах мы пытались получить информацию о файле сценария. Это самый низкий уровень справочной функции. «Обычные» скрипты не принимают таких вещей, как параметры, и в них есть довольно скучная информация, поэтому мы делаем все возможное. Вот почему при запуске Get-Help proc он возвращает поисковую информацию, потому что поисковая информация обычно более полезна для вас.

Функции и модули разные. Они первоклассные граждане, потому что у нас больше информации и она действительно важна. Если мы не хотим писать полный модуль (не намного сложнее, чем показано ниже), мы можем написать наш скрипт как функцию. Затем мы импортируем его в сеанс (запускаем . .\Invoke-Process.ps1), чтобы сделать функцию доступной, и получаем потрясающую помощь:

Invoke-Process.ps1

<#
.SYNOPSIS
    Invoke-Process runs programs
.DESCRIPTION
    Connects to array of computers provided, and runs scripts.
.PARAMETER Servers
    The array of Servers
.PARAMETER Program
    Program to run
#>
Function Invoke-Process {
    Param (
        [string[]]$Server,
        [string]$Program
    )
    ....
}
PS C:\> . .\Invoke-Process.ps1
PS C:\> Set-Alias proc Invoke-Process
PS C:\> Get-Help proc

NAME
    Invoke-Process

SYNOPSIS
    Invoke-Process runs programs


SYNTAX
    Invoke-Process [[-Server] <String[]>] [[-Program] <String>] [<CommonParameters>]


DESCRIPTION
    Connects to array of computers provided, and runs scripts.


RELATED LINKS

REMARKS
    To see the examples, type: "get-help Invoke-Process -examples".
    For more information, type: "get-help Invoke-Process -detailed".
    For technical information, type: "get-help Invoke-Process -full".

Просто добавив немного дополнительной информации, вы легко получите то, чего вы хотите / ожидаете от помощи.

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