Bagaimana cara menghitung objek di PowerShell?


143

Saat saya membaca di panduan pengguna PowerShell, salah satu konsep inti PowerShell adalah bahwa perintah menerima dan mengembalikan objek, bukan teks. Jadi misalnya, menjalankan get-aliasmengembalikan saya sejumlah System.Management.Automation.AliasInfoobjek:

PS Z: \> get-alias

Definisi Nama Jenis Perintah
----------- ---- ----------
Alias% ForEach-Object
Alias? Dimana-Objek
Alias ​​ac Add-Content
Alias ​​asnp Add-PSSnapIn
Kucing Alias ​​Dapatkan-Konten
Alias ​​cd Set-Location
Alias ​​chdir Set-Location
...

Sekarang, bagaimana cara menghitung benda-benda ini?

Jawaban:


206

Ini akan membuat Anda menghitung:

get-alias | measure

Anda dapat mengerjakan hasil seperti dengan objek:

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

Dan jika Anda juga ingin memiliki alias di beberapa variabel, Anda dapat menggunakan Tee-Object:

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

Beberapa info lebih lanjut tentang cmdlet Ukur-Objek ada di Technet .

Jangan bingung dengan cmdlet Measure-Command yang untuk mengukur waktu. (lagi di Technet )


3
Saya menggunakan $Counter = $(get-alias | measure).Countkarena selalu mengembalikan nilai 1 jika hanya ada satu kejadian, seperti yang Anda katakan.
DarkLite1

6
Pilihan lain:get-alias | measure | % { $_.Count }
Shameer

fyi: measureadalah kependekan dari Measure-Object; dan mengembalikan banyak hal-hal lain - seperti Average, Sum, Maximum, dll ...
BrainSlugs83

1
Mengapa tidak hanya (gal) .count? Membutuhkan PS v3 atau IIRC yang lebih tinggi. EDIT: ini sudah dijawab.
uranibaba

4
@Shameer Sementara kita melakukannya, seseorang dapat menggunakan Get-Alias | Measure-Object | Select-Object -ExpandProperty Countuntuk menyingkirkan %dan {}. Apa yang lebih mudah untuk ditulis dan dibaca adalah untuk diskusi lain.
LosManos

112

Sesingkat jawaban @ jumbo adalah :-) Anda dapat melakukannya dengan lebih singkat. Ini hanya mengembalikan Countproperti dari array yang dikembalikan oleh sub-ekspresi anteseden:

@(Get-Alias).Count

Beberapa hal yang perlu diperhatikan:

  1. Anda dapat menempatkan ekspresi kompleks yang sewenang-wenang sebagai pengganti Get-Alias, misalnya:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
    
  2. Tanda-tanda awal (@) diperlukan untuk solusi yang kuat. Selama jawabannya adalah dua atau lebih besar Anda akan mendapatkan jawaban yang setara dengan atau tanpa @, tapi ketika jawabannya adalah nol atau satu Anda akan mendapatkan tidak ada output yang kecuali jika Anda memiliki tanda @! (Ini memaksa Countproperti ada dengan memaksa output menjadi array.)

Pembaruan 2012.01.30

Hal di atas berlaku untuk PowerShell V2. Salah satu fitur baru PowerShell V3 adalah Anda memiliki Countproperti bahkan untuk lajang, jadi tanda at menjadi tidak penting untuk skenario ini.


3
Saya tahu ini sudah tua, tetapi bagi orang lain yang mencari ini… v3 + sepertinya tidak berfungsi tanpa @ untuk hitungan <2 jika Set-StrictMode -Version Latestdigunakan. Saya baru saja menemukan ini hari ini (pada 5.1) - sesuatu bekerja secara interaktif yang tidak berfungsi dalam suatu fungsi. Saya melacaknya ke fungsi yang memiliki Set-StrictMode di dalamnya; ketika saya menyetel mode ketat secara interaktif, itu juga tidak berfungsi.
vr8ce

Tangkapan bagus, @ vr8ce! Saya juga seorang pendukung kuat Set-StrictMode, jadi saya seharusnya memperhatikan itu.
Michael Sorens

Untuk memperluas saran @ vr8ce, saya tidak dapat menggunakan @ ($ myObject) untuk menghitung objek yang ada. Jadi saya menggunakan if ($myObject.PSobject.Properties.Name -contains "count")(dari stackoverflow.com/questions/26997511/… ) sebelum mencoba menguji properti hitungan. Saya benci PoSH membuat saya melakukan ini, tetapi Mode Ketat sangat berharga.
duct_tape_coder

21

Cukup gunakan tanda kurung dan 'hitung'. Ini berlaku untuk Powershell v3

(get-alias).count

1
Ini tidak memberikan jawaban atas pertanyaan. Untuk mengkritik atau meminta klarifikasi dari seorang penulis, tinggalkan komentar di bawah postingannya.
Zo Memiliki

@Amien Oke. Saya melakukan pengeditan. Dalam SO orang umumnya datang dari jawaban pertama sampai terakhir. Mereka tidak akan tiba-tiba melompat ke jawaban ketiga dan menjadi bingung. Sehingga saya jadikan sebagai kelanjutan dari dua jawaban pertama. Jawaban itu lebih masuk akal daripada yang diedit ini.
prabhakaran

1
Ini sudah tercakup dalam jawaban ini . Anda pada dasarnya hanya mengulangi apa yang sudah dikatakan dua tahun setelah dikatakan.
Liam

1
@Liam Jawaban itu untuk PowerShell v2. Jawaban saya untuk PowerShell v3. Seperti yang Anda katakan, jawaban ini tercakup / diceritakan secara harfiah dalam pembaruan (Pembaruan 2012.01.30) dalam jawaban itu. Saya baru saja memberikan bagian coding.
prabhakaran

5

@($output).Counttidak selalu memberikan hasil yang benar. Saya menggunakan ($output | Measure).Countmetode ini.

Saya menemukan ini dengan VMware Get-VmQuestion cmdlet:

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

Jawaban yang diberikannya adalah satu, sedangkan

$output

tidak menghasilkan keluaran (jawaban yang benar adalah 0 seperti yang dihasilkan dengan Measuremetode).

Ini sepertinya hanya menjadi kasus dengan 0 dan 1. Apa pun di atas 1 benar dengan pengujian terbatas.


Chris, saya pikir untuk mendapatkan apa yang Anda inginkan, Anda perlu melakukan ini: @ (Get-VmQuestion -VM vm1) .count Anda tidak dapat memaksa output menjadi array ... setelah output sudah dibuat . Itulah yang sedang Anda lakukan.
Daniel Peel

0

dalam pertukaran saya cmd-biarkan yang Anda berikan tidak berfungsi, jawabannya nol, jadi saya harus membuat sedikit koreksi dan bekerja dengan baik untuk saya:

@(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
Anda telah membagikan info bagus tentang menarik informasi dari Exchange menggunakan PowerShell, dan menyembunyikannya di sana, menjadikannya jawaban yang valid tetapi tidak untuk pertanyaan ini.
Dzamo Norton

Jika Anda melihat dengan penuh perhatian, Anda akan melihat bahwa keempat jawaban memberikan @(...).Countsintaks.
ulidtko
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.