从powershell中的列中选择不同的项目

时间:2011-12-09 00:01:03

标签: powershell distinct-values

如果我在PowerShell中发出以下命令,我会收到很多行。

PS C:\Users\benh> get-command

CommandType     Name                               ModuleName                         Definition
-----------     ----                               ----------                         ----------
Cmdlet          Get-Variable                       Microsoft.PowerShell.Utility       Get-Variable...
Cmdlet          Get-WebAppDomain                   WebAdministration                  Get-WebAppDomain...
Cmdlet          Get-WebApplication                 WebAdministration                  Get-WebApplication...
Cmdlet          Get-WebAppPoolState                WebAdministration                  Get-WebAppPoolState...
...
Cmdlet          Get-WinEvent                       Microsoft.PowerShell.Diagnostics   Get-WinEvent...
Cmdlet          Get-WmiObject                      Microsoft.PowerShell.Management    Get-WmiObject...
Cmdlet          Get-WSManCredSSP                   Microsoft.WSMan.Management         Get-WSManCredSSP...
Cmdlet          Get-WSManInstance                  Microsoft.WSMan.Management         Get-WSManInstance...
Cmdlet          Group-Object                       Microsoft.PowerShell.Utility       Group-Object...
Cmdlet          Import-Alias                       Microsoft.PowerShell.Utility       Import-Alias...
Cmdlet          Import-Clixml                      Microsoft.PowerShell.Utility       Import-Clixml...
Cmdlet          Import-Counter                     Microsoft.PowerShell.Diagnostics   Import-Counter...
Cmdlet          Import-Csv                         Microsoft.PowerShell.Utility       Import-Csv...
Cmdlet          Import-LocalizedData               Microsoft.PowerShell.Utility       Import-LocalizedData...
Cmdlet          Import-Module                      Microsoft.PowerShell.Core          ...

想要做的是获取Get-Command返回的所有不同的ModuleNames。如何使用PowerShell执行此操作?

在伪C#中:

PowerShell.Exec("Get-Command").Select(a=> a.ModuleName).Distinct();

提前致谢!

4 个答案:

答案 0 :(得分:70)

你尝试过这样的事吗?

get-command | select ModuleName | sort-object -Property ModuleName -Unique

答案 1 :(得分:58)

更短:

get-command | select-object  moduleName -unique

答案 2 :(得分:5)

下面的2个命令会产生相同的结果,但是第一个命令将被排序并且执行时间有点贵。

当您有大量项目时,将更多地考虑执行时间,例如,如果要导入30,000行的csv文件。然后第二个选项会更快,一旦你获得了唯一的值,你可以根据需要对它们进行排序,因为这里的排序将在更少的项目上完成,从而提高性能。

1

get-command | select ModuleName | sort-object -Property ModuleName -Unique

# This will give you the execution time
Measure-Command {get-command | select ModuleName | sort-object -Property ModuleName -Unique}

2

get-command | select ModuleName -Unique

# This will give you the execution time
Measure-Command {get-command | select ModuleName -Unique}

答案 3 :(得分:4)

另一种选择:

Get-Command | Group-Object ModuleName -NoElement | Select-Object Name