PowerShell'de nesneler nasıl sayılır?


140

PowerShell kullanıcı kılavuzunda okuduğum gibi, temel PowerShell kavramlarından biri, komutların metin yerine nesneleri kabul etmesi ve döndürmesidir . Örneğin, koşmak get-aliasbana birkaç System.Management.Automation.AliasInfonesne döndürür :

PS Z: \> takma ad

Komut Türü Adı Tanımı
----------- ---- ----------
Takma Ad% ForEach-Object
Takma ad? Nerede-Nesne
Takma ad ac Ek İçeriği
Takma ad asnp Add-PSSnapIn
Takma ad kedi Get-Content
Takma ad cd Seti-Konumu
Takma ad chdir Set-Location
...

Şimdi, bu nesnelerin sayısını nasıl elde edebilirim?

Yanıtlar:


201

Bu size satacak:

get-alias | measure

Sonuçla nesne gibi çalışabilirsiniz:

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

Ve bazı değişkenlerde takma adlara sahip olmak isterseniz, Tee-Object kullanabilirsiniz:

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

Measure-Object cmdlet'i hakkında daha fazla bilgi Technet'te .

Zaman ölçümü için Measure-Command cmdlet'i ile karıştırmayın. (yine Technet'te )


3
$Counter = $(get-alias | measure).CountDediğin gibi, sadece tek bir olay olması durumunda her zaman 1 değerini döndürdüğü için kullandım .
DarkLite1

6
Başka bir seçenek:get-alias | measure | % { $_.Count }
Shameer

fyi: measurekısaltması Measure-Object; gibi - ve diğer bir sürü şey döndüren Average, Sum, Maximum, vb ...
BrainSlugs83

1
Neden sadece (gal) .count değil? PS v3 veya üstü IIRC gerektirir. EDIT: Bu zaten cevaplandı.
uranibaba

4
@Shameer Biz oradayken Get-Alias | Measure-Object | Select-Object -ExpandProperty Count, %ve kurtulmak için kullanabilirsiniz {}. Yazması ve okuması daha kolay olan başka bir tartışma içindir.
LosManos

110

@ Jumbo'nun cevabı :-) kadar kısa bir sürede bunu daha da ters yapabilirsiniz. Bu Count, önceki alt ifade tarafından döndürülen dizinin özelliğini döndürür :

@(Get-Alias).Count

Dikkat edilmesi gereken birkaç nokta:

  1. Yerine rastgele karmaşık bir ifade koyabilirsiniz Get-Alias, örneğin:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
  2. Sağlam bir çözüm için başlangıç ​​işareti (@) gereklidir . Cevap iki veya daha büyük olduğu sürece, @ ile veya olmadan eşdeğer bir cevap alırsınız, ancak cevap sıfır veya bir olduğunda, @ işaretine sahip olmadığınız sürece hiçbir çıktı elde edemezsiniz! ( CountÇıktıyı bir dizi olmaya zorlayarak özelliği var olmaya zorlar.)

2012.01.30 Güncellemesi

Yukarıdakiler PowerShell V2 için geçerlidir. PowerShell V3'ün yeni özelliklerinden biri, tektonlar Countiçin bile bir özelliğiniz olmasıdır, bu nedenle at-sign bu senaryo için önemsiz hale gelir.


3
Bunun eski olduğunu biliyorum, ama bunu arayanlar için… v3 + Set-StrictMode -Version Latestkullanıldıysa sayı <2 için @ olmadan işe yaramaz gibi görünüyor . Bugün bununla (5.1'de) karşılaştım - etkileşimli olarak çalışan ve bir işlevde çalışmayan bir şey. Ben Set-StrictMode işlevi var aşağı izledi; etkileşimli olarak katı mod ayarladığımda da işe yaramadı.
vr8ce

İyi yakaladın @ vr8ce! Ben de güçlü bir savunucusuyum Set-StrictMode, bu yüzden bunu fark etmiş olmalıydım.
Michael Sorens

@ Vr8ce'nin tavsiyesini genişletmek için, varolan bir nesneyi saymak için @ ($ myObject) özelliğini kullanamadım. Bu yüzden count özelliğini test etmeden önce bir if ($myObject.PSobject.Properties.Name -contains "count")( stackoverflow.com/questions/26997511/… ) kullanıyorum . PoSH'nin bunu yapmamdan nefret ediyorum ama Sıkı Mod buna değer.
duct_tape_coder

21

Parantez kullanın ve 'sayın'. Bu, Powershell v3 için geçerlidir

(get-alias).count

1
Bu soruya bir cevap sağlamaz. Bir yazardan eleştiri veya açıklama istemek için gönderilerinin altına bir yorum bırakın.
Zo

@Damien Tamam. Düzenlemeyi ben yaptım. SO'da insanlar genellikle ilk cevaptan sonuncuya kadar gelirler. Aniden üçüncü cevaba atlayıp alışmazlar. Böylece ilk iki cevabın devamı olarak yaptım. Bu cevap, düzenlenen cevaptan daha mantıklı.
prabhakaran

1
Bu zaten bu cevapta ele alınmıştır . Temel olarak sadece tekrarlayan sizin söyledikten iki yıl sonra söylenmişti.
Liam

1
@Liam Bu cevap powershell v2 içindir. Cevabım powershell v3 için. Söylediğiniz gibi, bu cevap tam anlamıyla güncellemede (2012.01.30 Güncelleme) bu cevabın kapsamındadır / anlatılmıştır. Kodlama kısmını verdim.
prabhakaran

5

@($output).Counther zaman doğru sonuç vermez. ($output | Measure).CountYöntemi kullandım .

Bunu VMware Get-VmQuestion cmdlet ile buldum:

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

Verdiği cevap bir, buna karşılık

$output

çıktı üretilmedi (doğru cevap Measureyöntemle üretildiği gibi 0 idi ).

Bu sadece 0 ve 1 için geçerli görünüyordu. 1'in üzerindeki her şey sınırlı testlerle doğruydu.


Chris, bunu yapmak istediğini istediğini elde etmeyi düşünüyorum: @ (Get-VmQuestion -VM vm1) .count Çıktı bir dizi olmaya zorlayamazsın ... çıktı zaten yapıldıktan sonra . Yaptığın şey bu.
Daniel Peel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.