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-alias
mengembalikan saya sejumlah System.Management.Automation.AliasInfo
objek:
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?
powershell
scripting
ulidtko
sumber
sumber
$Counter = $(get-alias | measure).Count
karena selalu mengembalikan nilai 1 jika hanya ada satu kejadian, seperti yang Anda katakan.get-alias | measure | % { $_.Count }
measure
adalah kependekan dariMeasure-Object
; dan mengembalikan banyak hal-hal lain - sepertiAverage
,Sum
,Maximum
, dll ...Get-Alias | Measure-Object | Select-Object -ExpandProperty Count
untuk menyingkirkan%
dan{}
. Apa yang lebih mudah untuk ditulis dan dibaca adalah untuk diskusi lain.Sesingkat jawaban @ jumbo adalah :-) Anda dapat melakukannya dengan lebih singkat. Ini hanya mengembalikan
Count
properti dari array yang dikembalikan oleh sub-ekspresi anteseden:Beberapa hal yang perlu diperhatikan:
Anda dapat menempatkan ekspresi kompleks yang sewenang-wenang sebagai pengganti
Get-Alias
, misalnya:@(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
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
Count
properti 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
Count
properti bahkan untuk lajang, jadi tanda at menjadi tidak penting untuk skenario ini.sumber
Set-StrictMode -Version Latest
digunakan. 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.Set-StrictMode
, jadi saya seharusnya memperhatikan itu.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.Cukup gunakan tanda kurung dan 'hitung'. Ini berlaku untuk Powershell v3
sumber
@($output).Count
tidak selalu memberikan hasil yang benar. Saya menggunakan($output | Measure).Count
metode 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
Measure
metode).Ini sepertinya hanya menjadi kasus dengan 0 dan 1. Apa pun di atas 1 benar dengan pengujian terbatas.
sumber
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 "[email protected]" | where {$_.Event ID -eq "DELIVER"}).count
sumber
@(...).Count
sintaks.