2011-12-09 7 views
35

Se si esegue il comando seguente in PowerShell, vengono restituite molte righe.selezionare elementi distinti da una colonna in 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   ... 

Quello che voglio fare è ottenere tutti i moduleNames distinti restituiti da Get-Command. Come posso fare questo con PowerShell?

In pseudo-C#:

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

Grazie in anticipo!

+2

Non proprio quello che hai chiesto, ma considerare l'utilizzo di "Modulo Get-", invece. –

risposta

54

Hai provato qualcosa del genere?

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

Plain old * select * era esattamente quello che stavo cercando, grazie! –

+0

+1 poiché questa soluzione non fa distinzione tra maiuscole e minuscole, Ex, ottiene i nomi di computer AD e i record DNS e cerca di mostrare solo nomi univoci quando la maiuscola potrebbe essere diversa. –

52

Anche corta:

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

Fyi, questa distinzione tra maiuscole e minuscole, per la distinzione tra maiuscole e minuscole usa 'Sort-Object -unique' come nella [risposta di srgerg] (http://stackoverflow.com/a/8439487/101679). [Riferimento] (https://blogs.technet.microsoft.com/heyscriptingguy/2012/01/15/use-powershell-to-choose-unique-objects-from-a-sorted-list/) –

+0

Buono a sapersi che -unitario in Select-object è case-sensitive. Tuttavia, i nomi dei moduli sono sensibili al maiuscolo/minuscolo? È possibile avere 2 moduli caricati dove l'unica differenza è nel caso in cui? –

+0

Io non la penso così, questo sarebbe più rilevante per il titolo della domanda rispetto al caso d'uso specifico del richiedente. –

4

Un'altra opzione:

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

Below 2 comandi emergere stesso risultato, ma il primo saranno filtrate e un po 'costoso in tempo di esecuzione .

Il tempo di esecuzione sarà preso più in considerazione quando avete un grande numero di elementi, ad esempio se si importano csv di file di 30.000 righe. Quindi la seconda opzione sarà più veloce e, una volta ottenuti i valori univoci, li ordinerai se ne hai bisogno, perché qui l'ordinamento verrà eseguito su un numero molto minore di elementi, quindi prestazioni migliori.

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}