web-dev-qa-db-ja.com

PowerShellの列から個別のアイテムを選択する

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          ...

私がwantすることは、Get-Commandによって返されるすべての異なるModuleNamesを取得することです。 PowerShellでこれを行うにはどうすればよいですか?

擬似C#の場合:

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

前もって感謝します!

49
Ben H

このようなことを試しましたか?

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

さらに短く:

get-command | select-object  moduleName -unique
59
Mike Shepard

以下の2つのコマンドは同じ結果をもたらしますが、最初のコマンドはソートされ、実行時間が少しかかります。

たとえば、30,000行のcsvファイルをインポートする場合、アイテムの数が多い場合、実行時間がより考慮されます。次に、2番目のオプションが高速になります。必要に応じて一意の値を取得したら、必要に応じて並べ替えます。これは、より少ない数のアイテムで並べ替えが行われるため、パフォーマンスが向上するためです。

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
Asad Refai

別のオプション:

Get-Command | Group-Object ModuleName -NoElement | Select-Object Name
4
Shay Levy