Làm cách nào để đếm các đối tượng trong PowerShell?


139

Khi tôi đọc trong hướng dẫn sử dụng PowerShell, một trong những khái niệm cốt lõi của PowerShell là các lệnh chấp nhận và trả về các đối tượng thay vì văn bản. Vì vậy, ví dụ, việc chạy get-aliastrả về cho tôi một số System.Management.Automation.AliasInfođối tượng:

PS Z: \> bí danh

Định nghĩa tên CommandType
----------- ---- ----------
Bí danh% ForEach-Object
Bí danh? Đối tượng ở đâu
Alias ​​ac Add-Content
Bí danh asnp Add-PSSnapIn
Mèo bí danh Nhận nội dung
Bí danh cd Set-Location
Alias ​​chdir Set-Location
...

Bây giờ, làm thế nào để tôi có được số lượng của các đối tượng này?

Câu trả lời:


200

Điều này sẽ giúp bạn tính:

get-alias | measure

Bạn có thể làm việc với kết quả như với đối tượng:

$m = get-alias | measure
$m.Count

Và nếu bạn cũng muốn có bí danh trong một số biến, bạn có thể sử dụng Tee-Object:

$m = get-alias | tee -Variable aliases | measure
$m.Count
$aliases

Một số thông tin khác về lệnh ghép ngắn Đo-Đối tượng là trên Technet .

Đừng nhầm lẫn nó với lệnh ghép ngắn Đo-Lệnh dùng để đo thời gian. (một lần nữa trên Technet )


3
Tôi đã sử dụng $Counter = $(get-alias | measure).Countvì nó luôn trả về giá trị 1 trong trường hợp chỉ có một lần xuất hiện, như bạn đã nói.
DarkLite1

6
Một lựa chọn khác:get-alias | measure | % { $_.Count }
Shameer 2/10/2015

fyi: measureviết tắt của Measure-Object; và trả về rất nhiều thứ khác - như Average, Sum, Maximum, vv ...
BrainSlugs83

1
Tại sao không chỉ (gal) .count? Yêu cầu PS v3 trở lên IIRC. EDIT: điều này đã được trả lời.
uranibaba

3
@Shameer Trong khi chúng ta ở đó, người ta có thể sử dụng Get-Alias | Measure-Object | Select-Object -ExpandProperty Countđể thoát khỏi %{}. Những gì dễ dàng hơn để viết và đọc là cho một cuộc thảo luận khác.
LosManos

109

Miễn là câu trả lời của @ jumbo là :-) bạn có thể làm điều đó thậm chí còn chặt chẽ hơn. Điều này chỉ trả về thuộc Counttính của mảng được trả về bởi biểu thức con tiền đề:

@(Get-Alias).Count

Một vài điểm cần lưu ý:

  1. Bạn có thể đặt một biểu thức phức tạp tùy ý thay thế Get-Alias, ví dụ:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
  2. Dấu hiệu ban đầu (@) là cần thiết cho một giải pháp mạnh mẽ. Miễn là câu trả lời là hai hoặc lớn hơn, bạn sẽ nhận được câu trả lời tương đương có hoặc không có @, nhưng khi câu trả lời bằng 0 hoặc bạn sẽ không nhận được kết quả nào trừ khi bạn có dấu @! (Nó buộc thuộc Counttính tồn tại bằng cách buộc đầu ra là một mảng.)

Cập nhật 2012.01.30

Điều trên đúng với PowerShell V2. Một trong những tính năng mới của PowerShell V3 là bạn có một thuộc Counttính ngay cả đối với các singletons, do đó, dấu hiệu trở nên không quan trọng đối với kịch bản này.


3
Tôi biết điều này đã cũ, nhưng đối với những người khác đang tìm kiếm điều này v3 + dường như không hoạt động mà không có @ cho số <2 nếu Set-StrictMode -Version Latestđược sử dụng. Tôi vừa mới bắt đầu điều này hôm nay (ngày 5.1) - một cái gì đó hoạt động tương tác mà không hoạt động trong một chức năng. Tôi đã theo dõi nó xuống chức năng có Set-StrictMode trong đó; Khi tôi đặt chế độ nghiêm ngặt tương tác, nó cũng không hoạt động.
vr8ce

Bắt tốt, @ vr8ce! Tôi cũng là một người ủng hộ mạnh mẽ Set-StrictMode, vì vậy tôi nên nhận thấy điều đó.
Michael Sorens

Để mở rộng lời khuyên của @ vr8ce, tôi không thể sử dụng @ ($ myObject) để đếm số lượng đối tượng hiện có. Vì vậy, tôi sử dụng một if ($myObject.PSobject.Properties.Name -contains "count")(từ stackoverflow.com/questions/26997511/ - ) trước khi thử kiểm tra thuộc tính đếm. Tôi ghét rằng PoSH khiến tôi làm điều này nhưng Chế độ nghiêm ngặt là xứng đáng.
duct_tape_coder

21

Chỉ cần sử dụng dấu ngoặc đơn và 'đếm'. Điều này áp dụng cho Powershell v3

(get-alias).count

1
Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ.
Zo có

@Damien OK. Tôi đã thực hiện chỉnh sửa. Trong SO mọi người thường đến từ câu trả lời đầu tiên cho đến cuối cùng. Họ sẽ không đột nhiên nhảy vào câu trả lời thứ ba và bối rối. Vì vậy, tôi đã làm cho nó như là một tiếp tục của hai câu trả lời đầu tiên. Câu trả lời đó có ý nghĩa hơn sau đó chỉnh sửa một.
prabhakaran

1
Điều này đã được bao phủ trong câu trả lời này . Về cơ bản, bạn chỉ cần lặp lại những gì đã được nói hai năm sau khi nó được nói.
Liam

1
@Liam Câu trả lời đó là dành cho powershell v2. Câu trả lời của tôi là cho powershell v3. Như bạn đã nói câu trả lời này được trình bày / nói theo nghĩa đen trong bản cập nhật (Cập nhật 2012.01.30) trong câu trả lời đó. Tôi chỉ đưa ra một phần mã hóa.
prabhakaran

5

@($output).Countkhông phải lúc nào cũng tạo ra kết quả chính xác. Tôi đã sử dụng ($output | Measure).Countphương pháp.

Tôi đã tìm thấy điều này với lệnh ghép ngắn VMware Get-VmQuestion:

$output = Get-VmQuestion -VM vm1
@($output).Count

Câu trả lời mà nó đưa ra là một, trong khi

$output

sản xuất không có đầu ra (câu trả lời đúng là 0 như được tạo ra với Measurephương thức).

Điều này dường như chỉ xảy ra với 0 và 1. Mọi thứ trên 1 đều đúng với thử nghiệm giới hạn.


Chris, tôi nghĩ để có được những gì bạn muốn mà bạn cần phải làm điều này: @ (Get-VmQuestion -VM vm1) .count Bạn không thể buộc đầu ra là một mảng ... một khi đầu ra đã được thực hiện . Đó là những gì bạn đang làm.
Daniel Peel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.