Get-Command: одна команда — два сценария использования — неожиданно два очень разных результата

Я получаю два разных результата при использовании одной и той же команды в зависимости от того, как она используется. Я использую PowerShell версии 5.

Введя в консоль следующее, как и ожидалось, я получаю краткий список команд, доступных в модуле PSReadline.

gcm -module psreadline

Однако, когда я пытаюсь сделать то же самое, используя приведенный ниже скрипт, я получаю очень длинный список TMI.

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

Может ли кто-нибудь заставить приведенный ниже скрипт просто выводить краткий список команд, как это делает приведенная выше команда?

Модуль, используемый для проверки, может быть другим модулем — не обязательно psreadline.

Заранее спасибо.

# List loaded modules & get commands for a module specified by the user via user input:

cls
write-host "`n`n`n"
write-host " Loaded Modules: " -f darkblue -b white
write-host "`n`n"
get-module
write-host "`n`n"
$strString = " Get commands for a module  "
write-host $strString -f darkblue -b white
write-host "`n`n`n"
$input=Read-Host " Enter module name:   " ;
gcm -module $input

person Jimi T    schedule 20.10.2015    source источник
comment
gcm -module $input|Out-Host. И не использует $input. Это одна из автоматических переменных.   -  person user4003407    schedule 20.10.2015
comment
Спасибо Briantist - это работает отлично.   -  person Jimi T    schedule 20.10.2015


Ответы (1)


Когда объект записывается в консоль, PowerShell сначала пытается применить форматирование на основе типа — вы можете узнать больше об этой теме по адресу Get-Help about_Format.ps1xml.

Когда записывается более одного объекта, форматирование применяется только к одному типу — обычно к первому непримитивному типу — любые дополнительные объекты другого типа будут передаваться через Format-List, поэтому вы видите гораздо больше выход, чем вы ожидаете.

Рассмотрим следующий пример:

PS C:\> @(Get-Service)[0],@(Get-Process)[0]
Status   Name               DisplayName
------   ----               -----------
Stopped  AService           A Service

Id      : 2816
Handles : 264
CPU     : 1.078125
Name    : ApplicationFrameHost

Автоматическое форматирование применяется к выходу из Get-Service, но не Get-Process

Однако, если мы переупорядочим их:

PS C:\> @(Get-Process)[0],@(Get-Service)[0]

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    264      22    17548      20988 ...25     1.08   2816 ApplicationFrameHost

Status      : Stopped
Name        : AService
DisplayName : A Service

Get-Process теперь «первый выходит за дверь», и форматирование применяется к этому типу вывода, но не к последующим объектам другого отдельного типа.

Поскольку вы уже звонили Get-Module до Get-Command, вышесказанное применимо и в вашем случае.

Вы можете сами управлять форматированием вывода, передав команду Format-*:

Get-Module | Format-Table Name,Version
Get-Command -Module PSReadLine | Format-Table Name,CommandType
person Mathias R. Jessen    schedule 20.10.2015
comment
Спасибо Матиасу за исчерпывающее объяснение почему. - person Jimi T; 20.10.2015