2011-12-09 46 views
35

Si emite el siguiente comando en PowerShell, obtengo muchas filas.seleccionar elementos distintos de una columna en 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   ... 

Lo que yo quiero que hacer es conseguir todos los moduleNames distintos devueltos por Get-Command. ¿Cómo puedo hacer esto con PowerShell?

En pseudo-C#:

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

Gracias de antemano!

+2

No es realmente lo que usted pidió, pero considerar el uso de "Módulo Get-" en su lugar. –

Respuesta

54

¿Has probado algo como esto?

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

Llano antiguo * seleccionar * era exactamente lo que estaba buscando, ¡gracias! –

+0

+1 ya que esta solución no distingue entre mayúsculas y minúsculas, por ejemplo, obtener nombres de equipos con AD y registros de DNS e intentar mostrar solo nombres únicos cuando las mayúsculas pueden ser diferentes. –

52

aún más corto:

get-command | select-object moduleName -unique 
+1

Fyi, esto distingue entre mayúsculas y minúsculas, para uso insensible a mayúsculas y minúsculas 'Sort-Object -unique' como en [respuesta de srgerg] (http://stackoverflow.com/a/8439487/101679). [Referencia] (https://blogs.technet.microsoft.com/heyscriptingguy/2012/01/15/use-powershell-to-choose-unique-objects-from-a-sorted-list/) –

+0

Es bueno saber que -unique en Select-object distingue entre mayúsculas y minúsculas. Sin embargo, ¿son los nombres de los módulos sensibles a las may ¿Es posible tener 2 módulos cargados donde la única diferencia es en el caso? –

+0

No lo creo, esto sería más relevante para el título de la pregunta frente al caso de uso específico del asker. –

4

Otra opción:

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

por debajo del 2 comandos sacarán mismo resultado, pero el primero será ordenada y un poco caro en tiempo de ejecución .

El tiempo de ejecución se tendrá más en cuenta cuando tenga una gran cantidad de elementos, por ejemplo, si está importando el archivo csv de 30,000 filas. Luego, la segunda opción será más rápida, y una vez que obtenga valores únicos, ordénelos si lo necesita porque aquí la clasificación se realizará en un número de elementos mucho menor, por lo tanto, tendrá un mejor rendimiento.

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} 
Cuestiones relacionadas