PowerShellでオブジェクトを数える方法は?


139

PowerShellユーザーガイドで読んでいるように、PowerShellのコアコンセプトの1つは、コマンドが受け入れて返すということです。 がテキストではなくオブジェクトをです。たとえば、実行get-aliasすると、いくつかのSystem.Management.Automation.AliasInfoオブジェクトが返されます。

PS Z:\> get-alias

CommandType名の定義
----------- ---- ----------
エイリアス%ForEach-Object
エイリアス?Where-Object
Alias ac Add-Content
エイリアスasnp Add-PSSnapIn
Alias cat Get-Content
Alias cd Set-Location
Alias chdir Set-Location
...

さて、どのように私は、これらのオブジェクトの数を取得するのですか?

回答:


200

これはあなたを数えるでしょう:

get-alias | measure

オブジェクトと同じように結果を操作できます。

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

また、いくつかの変数にエイリアスを設定したい場合は、Tee-Objectを使用できます。

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

Measure-Objectコマンドレットの詳細については、Technetを参照してください

時間測定用のMeasure-Commandコマンドレットと混同しないでください。(再びTechnetに


3
私が使用$Counter = $(get-alias | measure).Countしたのは、あなたが言ったように、発生が1つしかない場合は常に値1を返すからです。
DarkLite1 2014年

6
別のオプション:get-alias | measure | % { $_.Count }
Shameer

fyi:はのmeasure略ですMeasure-Object。そして他の多くのものを返します-のようなAverageSumMaximum、等...
BrainSlugs83

1
なぜ(gal).countだけではないのですか?PS v3以降のIIRCが必要です。編集:これはすでに答えられています。
ウラニババ2018年

3
@Shameerその間Get-Alias | Measure-Object | Select-Object -ExpandProperty Count%とを取り除くために使用できます{}。書きやすく、読みやすいのは別の議論です。
LosManos

109

@jumboの答えが:-)である限り、あなたはそれをより簡潔に行うことができます。これは、Count前件部分式によって返された配列のプロパティを返すだけです。

@(Get-Alias).Count

注意すべきいくつかの点:

  1. Get-Aliasたとえば、次のように、任意の複雑な式を置くことができます。

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
  2. 堅牢なソリューションには、最初のアットマーク(@)が必要です。回答が2以上である限り、@を使用しても使用しなくても同等の回答が得られますが、回答が0または1の場合は、@記号がないと出力されません。(Count出力を強制的に配列にすることで、プロパティを強制的に存在させます。)

2012.01.30アップデート

上記はPowerShell V2にも当てはまります。PowerShell V3の新機能の1つは、Countシングルトンに対してもプロパティがあるため、このシナリオではアットマークが重要ではなくなることです。


3
私はこれが古いことを知っていますが、これを探しに行く人にとっては... Set-StrictMode -Version Latestが使用されている場合、v3 +はカウント<2の@なしでは機能しないようです。今日(5.1で)これに遭遇しました—インタラクティブに機能し、関数では機能しませんでした。私はそれをSet-StrictModeが含まれている関数まで追跡しました。ストリクトモードをインタラクティブに設定すると、機能しませんでした。
vr8ce 2017年

良いキャッチ、@ vr8ce!私もの強力な擁護者なSet-StrictModeので、気づくべきでした。
Michael Sorens

@ vr8ceのアドバイスを拡張すると、@($ myObject)を使用して既存のオブジェクトの数を取得できませんでした。したがって、countプロパティをテストする前にif ($myObject.PSobject.Properties.Name -contains "count")stackoverflow.com/questions/26997511/…から)を使用します。PoSHでこれができるのは嫌いですが、Strictモードはその価値があります。
–duct_tape_coder

21

括弧と 'count'を使用するだけです。これはPowershell v3に適用されます

(get-alias).count

1
これは質問に対する答えを提供しません。批評したり、著者に説明を求めたりするには、投稿の下にコメントを残してください。
Zoは2014年

@Damien OK。編集した。SOでは、一般的に人々は最初の答えから最後の答えまで来ます。彼らは突然3番目の答えに飛び込んで混乱することはありません。最初の2つの回答の続きとして作成しました。その答えは、この編集されたものよりも意味があります。
prabhakaran 14年

1
これはすでにこの回答でカバーされています。基本的には、発言されてから2年後に既に発言されていることを繰り返します。
リアム

1
@Liamその答えは、PowerShell v2用です。私の答えはpowershell v3です。あなたが言ったように、この回答はその回答のアップデート(2012.01.30アップデート)で文字通りカバー/伝えられています。私はコーディングの部分を提供しました。
prabhakaran

5

@($output).Count常に正しい結果が得られるとは限りません。私はその($output | Measure).Count方法を使いました。

VMware Get-VmQuestionコマンドレットでこれを見つけました:

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

それが与えた答えは1つですが、

$output

出力は生成されませんでした(Measureメソッドで生成されたときの正解は0でした)。

これは0と1の場合にのみ当てはまるようでした。1を超えるものは、限られたテストで正しかったです。


クリス、私はあなたがこれを行う必要があることを望んでいたものを手に入れようと思います:@(Get-VmQuestion -VM vm1).count出力を強制的に配列にすることはできません...出力が既に作成されていると。それはあなたがしていることです。
Daniel Peel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.