PowerShell में वस्तुओं की गणना कैसे करें?


140

जैसा कि मैं PowerShell उपयोगकर्ता मार्गदर्शिका में पढ़ रहा हूं, मुख्य PowerShell अवधारणाओं में से एक यह है कि आदेश पाठ के बजाय ऑब्जेक्ट स्वीकार करते हैं और वापस करते हैं । इसलिए उदाहरण के लिए, दौड़ने से get-aliasमुझे कई System.Management.Automation.AliasInfoवस्तुएं मिलती हैं:

PS Z: \> गेट-उर्फ

कमांड टाइप नाम परिभाषा
----------- ---- ----------
उपनाम% ForEach- ऑब्जेक्ट
उपनाम? कहाँ-वस्तु
एलियास एसी ऐड-कंटेंट
उपनाम जोड़ें-PSSnapIn
उपनाम बिल्ली जाओ-सामग्री
एलियास सीडी सेट-स्थान
उपनाम chdir सेट-स्थान
...

अब, मुझे इन वस्तुओं की गिनती कैसे मिलेगी?

जवाबों:


201

यह आपको मिल जाएगा:

get-alias | measure

आप ऑब्जेक्ट के साथ परिणाम के साथ काम कर सकते हैं:

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

और यदि आप कुछ चर में भी उपनाम रखना चाहते हैं, तो आप टी-ऑब्जेक्ट का उपयोग कर सकते हैं:

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

माप-वस्तु cmdlet पर कुछ और जानकारी टेक्नेट पर है

इसे मापने-कमांड cmdlet के साथ भ्रमित न करें जो समय मापने के लिए है। (फिर से तकनीक पर )


3
$Counter = $(get-alias | measure).Countजैसा कि आपने कहा था, मैंने हमेशा 1 मान लौटाया है, जैसा कि आपने कहा था।
डार्कलाइट 1

6
एक अन्य विकल्प:get-alias | measure | % { $_.Count }
शमीर

fyi: के measureलिए कम है Measure-Object; तरह - और अन्य सामग्री का एक बहुत कुछ देता है Average, Sum, Maximum, आदि ...
BrainSlugs83

1
सिर्फ (गैल) क्यों नहीं। PS v3 या उच्चतर IIRC की आवश्यकता है। EDIT: इसका उत्तर पहले ही दिया जा चुका है।
उरानीबाबा

3
@Shameer जब हम इस पर होते हैं, तो एक Get-Alias | Measure-Object | Select-Object -ExpandProperty Countछुटकारा पाने के लिए %और का उपयोग कर सकता है {}। लिखने और पढ़ने में जो आसान है वह दूसरी चर्चा के लिए है।
लॉसमनोस

110

जैसा कि @ जंबो का उत्तर :-) है, आप इसे और भी अधिक सरलता से कर सकते हैं। यह केवल Countपूर्व उप-अभिव्यक्ति द्वारा लौटाए गए सरणी की संपत्ति लौटाता है :

@(Get-Alias).Count

नोट करने के लिए कुछ बिंदु:

  1. Get-Aliasउदाहरण के लिए, आप एक जटिल जटिल अभिव्यक्ति रख सकते हैं :

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
  2. एक मजबूत समाधान के लिए प्रारंभिक एट-साइन (@) आवश्यक है । जब तक उत्तर दो या अधिक होता है, तब तक आपको @ के साथ या उसके बिना एक समान उत्तर मिलेगा, लेकिन जब उत्तर शून्य हो या एक तब तक आपको कोई आउटपुट नहीं मिलेगा जब तक कि आपके पास @ चिह्न न हो! (यह Countआउटपुट को एक सरणी होने के लिए मजबूर करके संपत्ति के अस्तित्व के लिए मजबूर करता है।)

2012.01.30 अपडेट

उपरोक्त PowerShell V2 के लिए सही है। PowerShell V3 की नई विशेषताओं में से एक यह है कि आपके पास एकल के लिए Countभी एक संपत्ति है, इसलिए इस परिदृश्य के लिए साइन-इन महत्वहीन हो जाता है।


3
मुझे पता है कि यह पुराना है, लेकिन दूसरों के लिए जो इसे ढूंढ रहे हैं ... v3 + गिनती के लिए @ के बिना काम नहीं करता है <2 यदि Set-StrictMode -Version Latestउपयोग किया जाता है। मैं सिर्फ आज (5.1 पर) भाग गया - कुछ ने अंतःक्रियात्मक रूप से काम किया जो किसी फ़ंक्शन में काम नहीं करता था। मैंने इसे नीचे ट्रैक करने के लिए फ़ंक्शन में सेट-स्ट्रिक्टमोड है; जब मैंने सख्त मोड को अंतःक्रियात्मक रूप से सेट किया, तो यह काम नहीं किया।
vr8ce

अच्छी पकड़, @ vr8ce! मैं भी एक मजबूत वकील Set-StrictModeहूं, इसलिए मुझे इस पर ध्यान देना चाहिए।
माइकल सोरेंस

@ Vr8ce की सलाह पर विस्तार करने के लिए, मैं किसी मौजूदा वस्तु पर एक गिनती प्राप्त करने के लिए @ ($ myObject) का उपयोग नहीं कर सका। तो मैं गिनती संपत्ति का परीक्षण करने से पहले एक if ($myObject.PSobject.Properties.Name -contains "count")( stackoverflow.com/questions/26997511/… से ) का उपयोग करता हूं । मुझे नफरत है कि PoSH मुझसे ऐसा करवाते हैं लेकिन स्ट्रिक्ट मोड इसके लायक है।
duct_tape_coder

21

बस कोष्ठक और 'गिनती' का उपयोग करें। यह Powershell v3 पर लागू होता है

(get-alias).count

1
यह प्रश्न का उत्तर प्रदान नहीं करता है। एक लेखक से स्पष्टीकरण की आलोचना करने या अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें।
ज़ो हैस

@ डैमियन ओके। मैंने एडिट किया। एसओ में लोग आम तौर पर पहले उत्तर से आखिरी तक आते हैं। वे तीसरे उत्तर में अचानक कूद जाते हैं और भ्रमित हो जाते हैं। ताकि मैंने इसे पहले दो उत्तरों की निरंतरता के रूप में बनाया। यह जवाब और अधिक समझ में आता है तब यह संपादित हुआ।
प्रभाकरन

1
यह पहले से ही इस उत्तर में शामिल है । आपके मूल रूप से अभी-अभी व्हाट्सएप को फिर से पुन: प्रसारित किया जा रहा है जो दो साल बाद कहा गया है।
लियाम

1
@ लिअम यह उत्तर शक्तियां v2 के लिए है। मेरा जवाब शक्तियों v3 के लिए है। जैसा कि आपने कहा कि यह उत्तर उस उत्तर में अद्यतन (2012.01.30 अद्यतन) में कवर / शाब्दिक है। मैंने सिर्फ कोडिंग पार्ट दिया।
प्रभाकरन

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) .count आप आउटपुट को एक सरणी होने के लिए बाध्य नहीं कर सकते ... एक बार जब आउटपुट पहले से ही बना है । जो आप कर रहे हैं।
डेनियल पील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.