【问题标题】:select distinct items from a column in powershell从PowerShell中的列中选择不同的项目
【发布时间】:2012-01-16 09:17:50
【问题描述】:

如果我在 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();

提前致谢!

【问题讨论】:

  • 不是你问的那样,但考虑改用“Get-Module”。

标签: powershell distinct-values


【解决方案1】:

以下 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}

【讨论】:

    【解决方案2】:

    另一种选择:

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

    【讨论】:

      【解决方案3】:

      更短:

      get-command | select-object  moduleName -unique
      

      【讨论】:

      • 仅供参考,这是区分大小写的,对于不区分大小写的使用 Sort-Object -unique 就像在 srgerg's answer 中一样。 Reference
      • 很高兴知道 Select-object 中的 -unique 区分大小写。但是,模块名称是否区分大小写?是否可以在唯一不同的情况下加载 2 个模块?
      • 我不这么认为,与提问者的具体用例相比,这与问题的标题更相关。
      【解决方案4】:

      你尝试过这样的事情吗?

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

      【讨论】:

      • 普通的旧 select 正是我想要的,谢谢!
      • +1,因为此解决方案不区分大小写,例如,获取 AD 计算机名称和 DNS 记录,并在大小写可能不同时尝试仅显示唯一名称。
      • 我是 PS 新手。你能解释为什么需要排序对象吗?我试图做“| select -unique”
      猜你喜欢
      • 1970-01-01
      • 2016-12-19
      • 2016-07-07
      • 2017-12-23
      • 2018-11-13
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多