マウスやタッチの操作に比べて、コマンドレット(コマンド)を使う最大のメリットは、同じ処理を効率的に繰り返せる点だ。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」に大量のファイル情報を格納する
全ファイルの合計容量を算出して確認するにはForeach-Objectとforeachメソッドの二つの方法がある。どちらでも結果は同じだ。
[画像のクリックで拡大表示]

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

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

この先は会員の登録が必要です。今なら有料会員(月額プラン)登録で6月末まで無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら