2011-12-09 38 views
35

Nếu tôi phát hành lệnh sau trong PowerShell, tôi nhận được nhiều hàng trở lại.chọn các mục riêng biệt từ một cột trong 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   ... 

Những gì tôi muốn làm là có được tất cả các ModuleNames biệt trả về bởi Get-Command. Làm thế nào tôi có thể làm điều này với PowerShell?

Trong pseudo-C#:

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

Cảm ơn trước!

+2

Không thực sự những gì bạn hỏi, nhưng xem xét sử dụng "Mô-đun Get-" để thay thế. –

Trả lời

54

Bạn đã thử một cái gì đó như thế này chưa?

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

Đồng bằng cũ * chọn * chính xác là những gì tôi đang tìm kiếm, cảm ơn! –

+0

+1 vì giải pháp này phân biệt chữ hoa chữ thường, Ví dụ, nhận tên máy tính AD và bản ghi DNS và cố gắng chỉ hiển thị tên duy nhất khi cách viết hoa có thể khác. –

52

Thậm chí ngắn hơn:

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

Fyi, đây là trường hợp nhạy cảm, cho trường hợp sử dụng không phân biệt 'Sort-Object -unique' như trong [câu trả lời của srgerg] (http://stackoverflow.com/a/8439487/101679). [Tham khảo] (https://blogs.technet.microsoft.com/heyscriptingguy/2012/01/15/use-powershell-to-choose-unique-objects-from-a-sorted-list/) –

+0

Điều cần biết là -unique trong Select-object là phân biệt chữ hoa chữ thường. Các tên mô-đun có phân biệt chữ hoa chữ thường không? Có thể có 2 mô-đun được nạp ở nơi khác biệt duy nhất trong trường hợp không? –

+0

Tôi không nghĩ như vậy, điều này sẽ phù hợp hơn với tiêu đề của câu hỏi so với trường hợp sử dụng cụ thể của người hỏi. –

4

Một tùy chọn khác:

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

Dưới 2 lệnh sẽ đưa ra kết quả tương tự, nhưng một trong những đầu tiên sẽ được sắp xếp và tốn kém một chút trong thời gian thực hiện .

Thời gian thực hiện sẽ được xem xét nhiều hơn khi bạn có số lượng lớn các mục, Ví dụ: nếu bạn nhập csv tệp có 30.000 hàng. Sau đó, tùy chọn thứ hai sẽ nhanh hơn, và một khi bạn nhận được các giá trị duy nhất sắp xếp chúng nếu bạn cần bởi vì ở đây phân loại sẽ được thực hiện trên một số ít hơn nhiều các mặt hàng do đó hiệu suất tốt hơn.

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} 
Các vấn đề liên quan