在PowerShell中从列中选择不同的项

59

如果我在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返回的所有不同的模块名称。如何使用PowerShell实现?

伪代码(类似于C#):

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

2
不完全是你所要求的,但考虑使用“Get-Module”代替。 - Eric Nicholson
4个回答

97

你尝试过类似这样的方法吗?

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

1
普通的 select 正是我所需要的,谢谢! - Ben H
由于此解决方案不区分大小写,因此“+1”。例如,获取AD计算机名称和DNS记录,并尝试仅在大写方式可能不同的情况下显示唯一名称。 - Chris Magnuson
我是PS的新手。你能解释一下为什么需要sort-object吗?我试图使用“| select -unique”。 - user5780947

68

更简短的代码:

get-command | select-object  moduleName -unique

3
请注意,这个命令区分大小写。如果要不区分大小写,请使用 Sort-Object -unique,就像srgerg的回答中所示。参考链接 - Chris Magnuson
很高兴知道-Select-object中的-unique是区分大小写的。但是模块名称是否区分大小写呢?有可能加载两个仅在大小写方面不同的模块吗? - Mike Shepard
我不这么认为,这更与问题的标题相关,而不是提问者的具体用例相关。 - Chris Magnuson

7
以下两个命令将呈现相同的结果,但第一个命令会排序并且执行时间更长。
当你有大量数据时,执行时间会更加重要。例如,如果你正在导入包含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}

5

另一种选择:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接