2

使用相同的命令时,我会得到两个不同的结果,具体取决于它的使用方式。我正在使用 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
4

1 回答 1

3

将对象写入控制台时,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-*cmdlet 自己控制输出格式:

Get-Module | Format-Table Name,Version
Get-Command -Module PSReadLine | Format-Table Name,CommandType
于 2015-10-20T15:54:06.700 回答