2011-09-30 25 views
6

Tại saoLàm thế nào để sử dụng tham số "-Property" cho lệnh ghép ngắn "Measure-Object" của PowerShell?

$a = GPS AcroRd32 | Measure 
$a.Count 

làm việc, khi

GPS AcroRd32 | Measure -Property Count 

không?

Ví dụ đầu tiên trả về giá trị 2, đó là những gì tôi muốn, một số nguyên.

Ví dụ thứ hai trả về này:

Measure-Object : Property "Count" cannot be found in any object(s) input. 
At line:1 char:23 
+ GPS AcroRd32 | Measure <<<< -Property Count 
    + CategoryInfo   : InvalidArgument: (:) [Measure-Object], PSArgumentException 
    + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand 



This Scripting Guy entry là nơi tôi học được cách sử dụng "Đếm" tài sản trong mẫu mã đầu tiên.

Mẫu mã thứ hai thực sự khó hiểu. Trong this Script Center reference, báo cáo kết quả sau hoạt động:

Import-Csv c:\scripts\test.txt | Measure-Object score -ave -max -min 

Nó vẫn hoạt động ngay cả khi nó lại viết như vậy:

Import-Csv c:\scripts\test.txt | Measure-Object -ave -max -min -property score 

tôi không có quá nhiều vấn đề với việc chấp nhận này cho đến khi tôi xem xét các Measure-Object help page . Định nghĩa thông số cho -Property <string[]> tiểu bang:

Giá trị mặc định là thuộc tính Đếm (Độ dài) của đối tượng.

Nếu Count là mặc định, thì không được phép chuyển rõ ràng Count hoạt động?

GPS AcroRd32 | Measure -Property Count # Fails 

Sau đây cung cấp cho tôi những thông tin tôi cần, ngoại trừ nó không cung cấp cho tôi với một số nguyên để thực hiện các hoạt động trên, như bạn sẽ thấy:

PS C:\Users\Me> $a = GPS AcroRd32 | Measure 
PS C:\Users\Me> $a 

Count : 2 
Average : 
Sum  : 
Maximum : 
Minimum : 
Property : 

PS C:\Users\Me> $a -is [int] 
False 



Vì vậy, tại sao ký hiệu chấm ($a.count) hoạt động, nhưng không phải là một tuyên bố rõ ràng bằng văn bản (GPS | Measure -Property Count)?

Nếu tôi được phép sử dụng Dot Notation, sau đó tôi sẽ, nhưng tôi muốn nhân cơ hội này để tìm hiểu thêm về cách * tại sao PowerShell hoạt động theo cách này, thay vì chỉ xây dựng một chiếu lệ sự hiểu biết về cú pháp của PowerShell. Nói cách khác, tôi muốn tránh biến thành Cargo Cult Programmer/Code Monkey.

Trả lời

5

Một điều bạn cần biết là trong PowerShell nói chung, và đặc biệt trong CmdLets bạn thao tác các đối tượng hoặc tập hợp các đối tượng.

Ví dụ: nếu chỉ một 'AcroRd32' đang chạy Get-Process sẽ trả lại [System.Diagnostics.Process], nếu có nhiều hơn một hoạt động, nó sẽ trả về bộ sưu tập là [System.Diagnostics.Process].

Trong trường hợp thứ hai bạn có thể viết:

(GPS AcroRd32).count 

Bởi vì một bộ sưu tập có một tài sản đếm. Việc thu thập đối tượng nhị nguyên cũng hợp lệ trong các tham số CmdLets mà phần lớn thời gian hỗ trợ các đối tượng hoặc danh sách các đối tượng (bộ sưu tập được xây dựng với toán tử ,).

PS C:\> (gps AcroRd32) -is [object[]] 
True 

Chỉ cần sử dụng Get-Member cmdlet:

PS C:\> (gps AcroRd32) | Get-Member 

    TypeName: System.Diagnostics.Process 

Name      MemberType  Definition 
----      ----------  ---------- 
Handles     AliasProperty Handles = Handlecount 
...      ... 

PS C:\> Get-Member -InputObject (gps AcroRd32) 

    TypeName: System.Object[] 

Name   MemberType Definition 
----   ---------- ---------- 
Count   AliasProperty Count = Length 
...   ... 
+0

'Get-Thành viên -InputObject (gps Acrord32) '- điều này đã giúp tôi hiểu nơi' Count' tài sản đến từ. Bây giờ tôi có thể thấy lý do tại sao "tuyên bố đầy đủ" của tôi không hoạt động, vì đó là cú pháp sai. Cảm ơn đã chỉ cho tôi cách sử dụng '(GPS AcroRd32) .Count'! – Stisfa

6

COUNT bất động sản là một tài sản của OUTPUT đối tượng (ví dụ kết quả Measure-Object), không phải là ĐẦU VÀO đối tượng.

Tham số -property chỉ định (các) thuộc tính nào của các đối tượng đầu vào sẽ được đánh giá. Không ai trong số này là COUNT trừ khi bạn vượt qua một mảng hoặc mảng hoặc một cái gì đó.

4

Tôi nghĩ rằng những gì bạn muốn là một cái gì đó như thế này:

gps AcroRd32 | measure-object | select -expand Count 
2

Nếu bạn chỉ tìm kiếm các số bạn có thể làm như sau:

$a = GPS AcroRd32 
$a.Count = 2 

$a = GPS AcroRd32 bộ $ a để một mảng đối tượng quá trình. Mảng có một cuộc gọi thành viên, Count, cho phép bạn xác định số lượng các phần tử đã có.

Lệnh Measure-Object (với bí danh measure) được sử dụng để đo lường giá trị trung bình, lớn nhất, tối thiểu và tổng của thuộc tính. Vì vậy, bạn có thể làm một cái gì đó như $a | measure -property Handles -sum và nhận được một số của tổng số tay cầm mở.

Các vấn đề liên quan