web-dev-qa-db-ja.com

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

私がPowerShellユーザーガイドで読んでいるように、PowerShellの中心的な概念の1つは、コマンドがテキストの代わりにオブジェクトを受け入れて返すということです。たとえば、get-aliasを実行すると、多数のSystem.Management.Automation.AliasInfoオブジェクトが返されます。

 PS Z:\> get-alias 
 
 CommandType名前の定義
 ----------- ---- ---- ------ 
別名%ForEach-Object 
別名? Where-Object 
エイリアスacアドコンテンツ
エイリアスasnp Add-PSSnapIn 
エイリアスcat Get-Content 
エイリアスcd Set-Location 
エイリアスchdir設置場所
 ... 

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

116
ulidtko

これはあなたが数えるようになります:

get-alias | measure

Objectと同じように結果を扱うことができます。

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

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

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

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

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

172
jumbo

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

@(Get-Alias).Count

注意すべき点がいくつかあります。

  1. Get-Aliasの代わりに任意の複雑な式を入れることができます。例えば:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
    
  2. 最初のアットマーク(@)はロバストな解決策のために必要です。答えが2以上であれば、@の有無にかかわらず同等の答えが得られますが、答えが0または1の場合は、noの出力が得られます。 @サイン! (出力を配列にすることでCountプロパティを強制的に存在させます。)

2012.01.30更新

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

95
Michael Sorens

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

(get-alias).count
12
prabhakaran

@($output).Countは必ずしも正しい結果を生成するわけではありません。私は($output | Measure).Countメソッドを使いました。

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

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

答えは1つですが、

$output

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

これは0と1の場合にのみ当てはまるようです。

4
bchris999