普段使用しているコンピューターには様々なアプリケーションがインストールされ、アップデートなどによって大量の一時ファイルなどが残ってしまう場合があります。いつの間にかハードディスクの空き容量がなくなってしまい、不要なファイルやフォルダを削除する必要が出てきます。コンピューターの中でどのフォルダが容量を多く占有しているのかを探索するのに便利なスクリプトを紹介します。ファイルダウンロードこの2つのスクリプトは、Get-ChildItemコマンドを利用して、指定したフォルダと配下のすべてのサブフォルダを探索して、容量の大きい上位20件を表示します。Sample1.ps1は、フォルダ内のファイルの合計サイズを集計してフォルダサイズとしています。含まれるサブフォルダの容量は含まれておらず、純粋なフォルダ内のファイルの合計サイズとなります。Sample2.ps2はフォルダ内のすべてのファイルとサブフォルダの合計サイズを集計しています。スクリプト内ではPowerShellの特徴である「パイプライン」を利用して、効率的にスクリプトを作成しています。Sample1.ps1とSample2.ps1のコードの違いは5行目と14行目の2箇所だけです。Sample1.ps1を元にコードを見ていきましょう。Get-ChildItemコマンドを利用したフォルダサイズの取得方法まずはルートフォルダ直下のファイルサイズを合計してフォルダサイズを取得します。パラメーターとして、探索対象のフォルダパスをルートフォルダとして指定します。パイプランを分解して一つずつ見ていきましょう。$RootFolderでルートフォルダ内のオブジェクトを取得します。「-Force」オプションを付けることで、既定で非表示設定となっているフォルダやオプションも探索対象とすることができますが、フォルダやファイルによっては特殊なオブジェクトがあるためアクセスができなくエラーとなってしまうことがあります。"SilentlyContinue"を指定しておきます。-ForceSample2.ps1では5行目に「-Recurse」オプションが付いています。-Sum)このオプションは、ルートフォルダ配下のサブフォルダ内のファイルまで再帰的に取得するためのものです。Sample1.ps1とSample2.ps1の違いは、純粋なフォルダ内のファイルサイズの合計をフォルダのサイズとするか、フォルダ内のファイルとサブフォルダ、さらにサブフォルダ内のファイル、フォルダというように、すべてを含めてフォルダサイズとするかの違いとなります。次にパイプラインで引き渡されたオブジェクトに対して、Where-Objectコマンドを使ってファイルのみ抽出しています。フォルダのサイズはフォルダ内に配置されたファイルのみの合計サイズとして計算する必要があります。ファイルのみを抽出するには、オブジェクトに対してGetType()コマンドを実行して、オブジェクト名が”FileInfo”となっている物を抽出します。パイプラインで引き渡されたオブジェクトが格納されています。これはPowerShellのあらかじめ決められている組み込み変数です。PowerShellの演算子で「=」(等号)の意味です。"FileInfo"}ファイルのみ抽出したオブジェクトに対して、Measure-Objectコマンドを使ってファイルサイズ(Lengthプロパティ)の合計値を-Sumオプションを付けて取得しています。最後に取得したオブジェクトを変数$Itemsに保存しておきます。-Sumルートフォルダのフォルダサイズ情報を配列に格納しておきます。この配列は最終的に、フォルダパスとフォルダサイズを配列に格納して、サイズ順に並び替え、上位10件を表示するため利用します。1MB))}$Folders変数が配列であることを定義します。[Array]$Folders[PSCustomObject]を使うと連想配列のフィールド名を独自に定義することができます(既定ではNameとValue)。フォルダパスと、フォルダサイズを格納します。–FでMB単位でカンマ付の小数点第一位の値に表示形式を直して保存しています。1MB))}次にルートフォルダ配下のサブフォルダに対してサイズ取得を行います。Get-ChildItemコマンドで-Recurseオプションを指定すると、サブフォルダ内のサブフォルダ、さらにそのサブフォルダというようにすべての子オブジェクトを取得します。このブロックは、ルートフォルダとは異なりフォルダ一覧を取得するので、Where-Objectコマンドでは"DirectoryInfo"を指定してフォルダのみ抽出しています。"DirectoryInfo"})取得したすべてのサブフォルダのオブジェクトそれぞれに対して、ファイルのサイズを合計してそれぞれのフォルダサイズとして計算していきます。すべてのフォルダ情報に対して処理を行う場合は、ForEach()の制御構文が便利です。$Itemsに格納されたオブジェクトを1つずつ順番に$iに格納してサイズ計算処理を行います。計算された全てのフォルダサイズ情報は、ルートフォルダの情報を格納した連想配列$Foldersに追加で格納します。$Items){~}$iにはフォルダ情報がオブジェクトとして格納されています。それぞれルートフォルダと同様にファイルの合計サイズを計算して、フォルダサイズとして連想配列に格納します。1MB))}Sample2.ps1では14行目に「-Recurse」オプションが付いています。-Sum)ルートフォルダと同様に、サブフォルダ内のすべてのサブフォルダに対して再帰的にファイルを取得して合計しています。最後にすべてのフォルダ情報を格納した連想配列$Foldersに対して、-Descendingオプションを使ってフォルダサイズを昇順で並べ替え、パイプラインを使って配列内の上位20件を抽出します。Format-Tableコマンドを使って、テーブル表示で出力します。このとき-AutoSizeオプションを指定すると、自動でテーブルサイズなどを調整して出力します。-AutoSizeスクリプトの実行結果。1.0スクリプトの実行結果。2.6以上、Get-ChildItemコマンドを利用したフォルダサイズの取得方法を紹介しました。Get-ChildItemコマンドは、サブフォルダを深く掘り下げる場合でも、再起コードを呼び出すといった手間が必要ありません。簡単なオプションスイッチ(-Recurse)を付けるだけで、自動的に再起処理を行ってくれるという優れものです。この他にも、特定のファイルを拡張子をキーとして抽出したり、ファイル構造だけではなく、レジストリの設定値を取得したりと様々な応用が可能です。チャレンジしてみてください。勝一GMOインターネット株式会社1999年6月GMOインターネットに入社。Windowsを用いたホスティング事業の立ち上げの際、サービス開発からその後の保守・運用まで1人で担当。2010年には「お名前.comWindowsデスクトップ」をリリースし、マイクロソフト社と強い信頼関係を構築。PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。