私が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設置場所 ...
さて、これらのオブジェクトの数をどうやって取得するのですか?
これはあなたが数えるようになります:
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 に)
@ジャンボの答えが:-)である限り、あなたはもっともっと簡潔にそれをすることができます。これは、先行する部分式によって返される配列のCount
プロパティを返すだけです。
@(Get-Alias).Count
注意すべき点がいくつかあります。
Get-Alias
の代わりに任意の複雑な式を入れることができます。例えば:
@(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
最初のアットマーク(@)はロバストな解決策のために必要です。答えが2以上であれば、@の有無にかかわらず同等の答えが得られますが、答えが0または1の場合は、noの出力が得られます。 @サイン! (出力を配列にすることでCount
プロパティを強制的に存在させます。)
2012.01.30更新
上記はPowerShell V2にも当てはまります。 PowerShell V3の新機能の1つは、シングルトンに対してもCount
プロパティがあるため、アットマークはこのシナリオでは重要ではなくなることです。
括弧と 'count'を使うだけです。これはPowershell v3に適用されます
(get-alias).count
@($output).Count
は必ずしも正しい結果を生成するわけではありません。私は($output | Measure).Count
メソッドを使いました。
これをVMware Get-VmQuestionコマンドレットで見つけました。
$output = Get-VmQuestion -VM vm1
@($output).Count
答えは1つですが、
$output
出力を生成しませんでした(Measure
メソッドで生成されたものと同じ正解は0です)。
これは0と1の場合にのみ当てはまるようです。