マウスやタッチの操作に比べて、コマンドレット(コマンド)を使う最大のメリットは、同じ処理を効率的に繰り返せる点だ。PowerShellで処理を繰り返すには、大きく分けて(1)Foreach-Objectまたはforeachメソッド、(2)Forループ、(3)DoまたはWhileループの三つの方法がある。

 コマンドの結果など、既に存在する配列やハッシュテーブルを使って繰り返し処理する場合には(1)を使用するとよい。PowerShellの繰り返し処理で頻繁に使う手法なので、ぜひ覚えておきたい。

 まず元になるデータを準備しよう。次のコマンドで、システム内のすべてのファイルの情報を変数に格納する。ときどきアクセスが拒否されるが気にしなくてよい

$Files = Get-ChildItem -File -Recurse

 これで変数「$Files」に大量のファイル情報が入るので、ディレクトリごとにファイル容量を集計してみよう。ディレクトリの名前はDirectoryName属性、ファイルのサイズはLength属性で取得できる。

 $Filesに含まれている全ファイルの合計容量を算出するには、以下のいずれかを入力する。$Filesに含まれるレコードを$_で1行ずつ読み出し、その中のLength(容量)を足す処理を繰り返している(図1)。

$Files | Foreach-Object { $total = $total + $_.Length }
$Files.foreach{ $total = $total + $_.Length }
図1●変数「$Files」に大量のファイル情報を格納する
図1●変数「$Files」に大量のファイル情報を格納する
全ファイルの合計容量を算出して確認するにはForeach-Objectとforeachメソッドの二つの方法がある。どちらでも結果は同じだ。
[画像のクリックで拡大表示]

 どちらを実行しても結果に違いはないが、処理時間には違いが出ることがある。ファイル数が6万1000程度の筆者の環境では前者のForeach-Objectで34秒、後者のforeachメソッドで27秒を要した

▼気にしなくてよい
もしファイル数が多すぎるようなら「-Depth 2」のように取得するディレクトリ階層を指定しよう。
▼要した
ファイル数が増えれば、速度の違いはさらに顕著になるだろう。