web-dev-qa-db-fra.com

sélectionner des éléments distincts dans une colonne dans PowerShell

Si j'émets la commande suivante dans PowerShell, je reçois beaucoup de lignes en retour.

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

Ce que je veux faire, c'est obtenir tous les noms de module distincts retournés par Get-Command. Comment puis-je faire cela avec PowerShell?

En pseudo-C #:

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

Merci d'avance!

49
Ben H

Avez-vous essayé quelque chose comme ça?

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

Encore plus court:

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

En dessous de 2 commandes, le même résultat apparaîtra, mais la première sera triée et un peu coûteuse en temps d'exécution.

Le temps d'exécution sera plus pris en compte lorsque vous avez un grand nombre d'éléments, par exemple si vous importez un fichier csv de 30 000 lignes. Ensuite, la deuxième option sera plus rapide, et une fois que vous obtiendrez des valeurs uniques, triez-les si vous en avez besoin, car ici, le tri se fera sur un nombre beaucoup moins important, d'où de meilleures performances.

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

Une autre option:

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