วิธีการนับวัตถุใน PowerShell


143

ขณะที่ฉันอ่านในคู่มือผู้ใช้ PowerShell หนึ่งในแนวคิดหลักของ PowerShell คือคำสั่งยอมรับและส่งคืนวัตถุแทนข้อความ ตัวอย่างเช่นการรันget-aliasจะส่งคืนSystem.Management.Automation.AliasInfoวัตถุจำนวนหนึ่งให้ฉัน:

PS Z: \> รับนามแฝง

นิยามชื่อ CommandType
----------- ---- ----------
นามแฝง% ForEach-Object
นามแฝง? ที่ไหน - วัตถุ
นามแฝง ac Add-Content
นามแฝง asnp Add-PSSnapIn
Alias ​​cat Get-Content
นามแฝง cd Set-Location
Alias ​​chdir Set-Location
...

ตอนนี้ฉันจะนับวัตถุเหล่านี้ได้อย่างไร

คำตอบ:


206

สิ่งนี้จะช่วยให้คุณนับ:

get-alias | measure

คุณสามารถทำงานกับผลลัพธ์เช่นเดียวกับวัตถุ:

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

และหากคุณต้องการมีนามแฝงในตัวแปรบางตัวคุณสามารถใช้ Tee-Object:

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

บางข้อมูลเพิ่มเติมเกี่ยวกับ cmdlet วัดวัตถุที่อยู่บนTechnet

อย่าสับสนกับ Measure-Command cmdlet ซึ่งมีไว้สำหรับการวัดเวลา (อีกครั้งในTechnet )


3
ฉันใช้$Counter = $(get-alias | measure).Countมันจะคืนค่า 1 เสมอในกรณีที่มีเพียงเหตุการณ์เดียวอย่างที่คุณพูด
DarkLite1

6
อีกทางเลือกหนึ่ง:get-alias | measure | % { $_.Count }
Shameer

fyi: measureย่อมาจากMeasure-Object; และผลตอบแทนมากของสิ่งอื่น ๆ ที่ชอบ - Average, Sum, Maximumฯลฯ ...
BrainSlugs83

1
ทำไมไม่แค่ (gal) .count? ต้องการ PS v3 หรือ IIRC ที่สูงกว่า แก้ไข: ได้รับคำตอบแล้ว
uranibaba

4
@Shameer ในขณะที่เรากำลังที่จะสามารถใช้Get-Alias | Measure-Object | Select-Object -ExpandProperty Countในการกำจัดและ% {}สิ่งที่ง่ายกว่าในการเขียนและอ่านคือการอภิปรายอื่น
LosManos

112

คำตอบสั้น ๆ ของ @ jumbo คือ :-) คุณสามารถทำได้มากยิ่งขึ้น สิ่งนี้จะส่งคืนCountคุณสมบัติของอาร์เรย์ที่ส่งคืนโดยนิพจน์ย่อยก่อนหน้านี้:

@(Get-Alias).Count

สองประเด็นที่ควรทราบ:

  1. คุณสามารถใส่นิพจน์ที่ซับซ้อนได้ตามอำเภอใจGet-Aliasตัวอย่างเช่น:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
    
  2. at-sign (@) เริ่มต้นจำเป็นสำหรับโซลูชันที่มีประสิทธิภาพ ตราบใดที่คำตอบคือสองหรือมากกว่าคุณจะได้คำตอบที่เท่ากันโดยมีหรือไม่มี @ แต่เมื่อคำตอบเป็นศูนย์หรือหนึ่งคุณจะไม่ได้ผลลัพธ์เว้นแต่คุณจะมีเครื่องหมาย @! (บังคับให้Countคุณสมบัติมีอยู่โดยบังคับให้เอาต์พุตเป็นอาร์เรย์)

ปรับปรุง 2012.01.30 น

ข้างต้นเป็นจริงสำหรับ PowerShell V2 คุณลักษณะใหม่อย่างหนึ่งของ PowerShell V3 คือคุณมีCountคุณสมบัติแม้กระทั่งสำหรับ singletons ดังนั้น at-sign จึงไม่สำคัญสำหรับสถานการณ์นี้


3
ฉันรู้ว่ามันเก่า แต่สำหรับคนอื่น ๆ ที่มองหาสิ่งนี้… v3 + ดูเหมือนจะไม่ทำงานหากไม่มีการนับ @ <2 หากSet-StrictMode -Version Latestใช้ ฉันเพิ่งพบสิ่งนี้ในวันนี้ (ในวันที่ 5.1) - มีบางอย่างทำงานแบบโต้ตอบซึ่งไม่ทำงานในฟังก์ชัน ฉันติดตามมันลงไปที่ฟังก์ชันมี Set-StrictMode อยู่ในนั้น เมื่อฉันตั้งค่าโหมดโต้ตอบแบบเข้มงวดมันก็ใช้ไม่ได้เช่นกัน
vr8ce

จับดี @ vr8ce! ฉันเป็นผู้ให้การสนับสนุนที่Set-StrictModeดีเช่นกันดังนั้นฉันควรสังเกตว่า
Michael Sorens

เพื่อขยายคำแนะนำของ @ vr8ce ฉันไม่สามารถใช้ @ ($ myObject) เพื่อนับจำนวนวัตถุที่มีอยู่ได้ ดังนั้นฉันจึงใช้if ($myObject.PSobject.Properties.Name -contains "count")(จากstackoverflow.com/questions/26997511/… ) ก่อนที่จะลองทดสอบคุณสมบัติการนับ ฉันเกลียดที่ PoSH ทำให้ฉันทำสิ่งนี้ แต่โหมดเข้มงวดก็คุ้มค่า
duct_tape_coder

21

เพียงใช้วงเล็บและ "นับ" สิ่งนี้ใช้กับ Powershell v3

(get-alias).count

1
สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้เขียนโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา
Zo มี

@ ดาเมียนโอเค. ฉันทำการแก้ไข ในคนทั่วไปมักมาจากคำตอบแรกจนถึงคำสุดท้าย ทันใดนั้นพวกเขาจะไม่รีบเข้าสู่คำตอบที่สามและสับสน ผมจึงทำให้มันเป็นความต่อเนื่องของสองคำตอบแรก คำตอบนั้นสมเหตุสมผลมากกว่าคำตอบที่แก้ไขนี้
prabhakaran

1
นี้ได้รับการคุ้มครองอยู่แล้วในคำตอบนี้ โดยพื้นฐานแล้วคุณเพียงแค่ทบทวนสิ่งที่พูดไปแล้วสองปีหลังจากที่มีการพูด
Liam

1
@ เลียมคำตอบนั้นมีไว้สำหรับ powershell v2 คำตอบของฉันคือ powershell v3 ดังที่คุณกล่าวว่าคำตอบนี้ครอบคลุม / บอกตามตัวอักษรในการอัปเดต (อัปเดต 2012.01.30) ในคำตอบนั้น ฉันแค่ให้ส่วนการเข้ารหัส
prabhakaran

5

@($output).Countไม่ได้ให้ผลลัพธ์ที่ถูกต้องเสมอไป ผมใช้($output | Measure).Countวิธี.

ฉันพบสิ่งนี้ด้วย VMware Get-VmQuestion cmdlet:

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

คำตอบที่ให้คือหนึ่งในขณะที่

$output

ไม่สร้างผลลัพธ์ (คำตอบที่ถูกต้องคือ 0 ตามที่สร้างด้วยMeasureวิธีการ)

สิ่งนี้ดูเหมือนจะเป็นกรณีที่มี 0 และ 1 เท่านั้นสิ่งที่เหนือ 1 ถูกต้องโดยมีการทดสอบแบบ จำกัด


คริสฉันคิดว่าจะได้รับสิ่งที่คุณต้องการซึ่งคุณต้องทำสิ่งนี้: @ (Get-VmQuestion -VM vm1) นับคุณไม่สามารถบังคับให้เอาต์พุตเป็นอาร์เรย์ได้ ... เมื่อสร้างเอาต์พุตแล้ว . ซึ่งเป็นสิ่งที่คุณกำลังทำ
Daniel Peel

0

ในการแลกเปลี่ยน cmd ที่คุณนำเสนอไม่ได้ผลคำตอบเป็นโมฆะดังนั้นฉันต้องทำการแก้ไขเล็กน้อยและทำงานได้ดีสำหรับฉัน:

@(get-transportservice | get-messagetrackinglog -Resultsize unlimited -Start "MM/DD/AAAA HH:MM" -End "MM/DD/AAAA HH:MM" -recipients "user@domain.com" | where {$_.Event
ID -eq "DELIVER"}).count

1
คุณได้แบ่งปันข้อมูลที่ดีเกี่ยวกับการดึงข้อมูลจาก Exchange โดยใช้ PowerShell และซ่อนอยู่ในนั้นนับเป็นคำตอบที่ถูกต้อง แต่ไม่ใช่สำหรับคำถามนี้
Dzamo Norton

หากคุณตั้งใจดูมากพอคุณจะเห็นว่าทั้ง 4 คำตอบให้@(...).Countไวยากรณ์
ulidtko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.