【PowerShell】Windowsのフォルダーサイズを取得する方法|サブフォルダー集計からリモート実行まで解説
Windowsユーザーの多くは、フォルダーのサイズを確認する最も簡単な方法として、エクスプローラーでフォルダーのプロパティを開くことを知っています。より経験を積んだユーザーは、TreeSizeやWinDirStatといったサードパーティ製ツールを好んで使うこともあるでしょう。しかし、特定のディレクトリ内のフォルダーサイズについてより詳細な統計情報を取得したい場合や、特定のファイル形式を除外・絞り込んで集計したい場合には、PowerShellを活用するのが最適です。この記事では、PowerShellを使って特定のフォルダー(およびすべてのサブフォルダー)のサイズを素早く取得する方法を紹介します。
フォルダーサイズ取得の基本:Get-ChildItemとMeasure-Object
PowerShellでは、Get-ChildItem(エイリアス:gci)とMeasure-Object(エイリアス:measure)のコマンドレットを組み合わせることで、ファイルやフォルダー(サブフォルダーを含む)のサイズを取得できます。前者は指定した条件に従って、指定ディレクトリ内のファイルの一覧(サイズ付き)を取得し、後者はその結果に対して合計値の算出などの演算を行います。
ヒント: 過去の記事では、Get-ChildItemコマンドレットを使ってディスク上の最大サイズのファイルを見つける方法を紹介しています。あわせて参考にしてください。
C:\ISOフォルダーのサイズを取得する例
たとえば、C:\ISOフォルダーのサイズを取得するには、次のコマンドを実行します。
Get-ChildItem C:\ISO | Measure-Object -Property Length -Sum
実行すると、Sumフィールドにそのディレクトリ内のファイルの合計サイズが表示されます。この例では約2.1GBとなっています(サイズはバイト単位で表示される点に注意してください)。
サイズをMBやGB単位に変換して表示する
バイト単位のままでは読みにくいため、MBやGBに変換すると便利です。次のコマンドを使用します。
(gci c:\iso | measure Length -s).sum / 1Gb
または:
(gci c:\iso | measure Length -s).sum / 1Mb
さらに、結果を小数点以下2桁に丸めて表示するには、書式指定演算子を使った次のコマンドが役立ちます。
"{0:N2} GB" -f ((gci c:\iso | measure Length -s).sum / 1Gb)
特定の拡張子のファイルだけを集計する
PowerShellを使えば、ディレクトリ内の特定の種類のファイルのみの合計サイズを計算することもできます。たとえば、フォルダー内のすべてのISOファイルの合計サイズを取得するには、次のようにワイルドカードを指定します。
(gci c:\iso *.iso | measure Length -s).sum / 1Mb
サブフォルダーを含めた合計サイズを取得する(-Recurse)
ここまでのコマンドでは、指定したディレクトリ直下のファイルの合計しか取得できません。ディレクトリ内にサブフォルダーがある場合、その中のファイルは計算されません。サブディレクトリを含む合計サイズを取得するには、-Recurseパラメーターを使用します。C:\Windowsフォルダー内のファイルの合計サイズを取得してみましょう。
"{0:N2} GB" -f ((gci -Force c:\Windows -Recurse -ErrorAction SilentlyContinue | measure Length -s).sum / 1Gb)
隠しファイルやシステムファイルのサイズも含めるために、-Force引数も併用しています。
この結果、筆者の環境ではローカルドライブ上のC:\Windowsのサイズは約40GBでした(スクリプトはNTFS圧縮を考慮していません)。
ヒント: ディレクトリへのアクセスエラー(PermissionDenied → DirUnauthorizedAccessError)を防ぐには、-ErrorAction SilentlyContinueパラメーターを付けておきます。アクセス権限のないフォルダーがあってもエラーを無視して処理を続行できるため、システムフォルダーの集計では必須と言えます。
ハードリンクによる重複カウントを避ける
このスクリプトには注意点があります。シンボリックリンクやハードリンクが含まれるディレクトリでは、サイズが正しく計算されないことがあります。たとえばC:\Windowsフォルダーには、WinSxSフォルダー(Windowsコンポーネントストア)内のファイルへのハードリンクが多数含まれており、同じファイルが何度もカウントされる可能性があります。ハードリンクを結果から除外するには、次のコマンドを使用します(完了までに時間がかかる点にご注意ください)。
"{0:N2} GB" -f ((gci -Force C:\windows -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -notmatch "HardLink" } | measure Length -s).sum / 1Gb)
実行結果を見ると、実際のWindowsフォルダーのサイズは少し小さくなっていることがわかります。
作成日などの条件でファイルを絞り込む
Where-Object(エイリアス:?)などのフィルターを使えば、集計対象のファイルを柔軟に選択できます。たとえば、2020年に作成されたファイルのサイズだけを取得するには、次のようにします。
(gci -Force c:\ps -Recurse -ErrorAction SilentlyContinue | ? {$_.CreationTime -gt '1/1/20' -AND $_.CreationTime -lt '12/31/20'} | measure Length -s).sum / 1Gb
各サブフォルダーのサイズを一括で取得する
指定したディレクトリ内の第一階層のサブフォルダーそれぞれについて、サイズをまとめて取得することもできます。たとえば、C:\Usersフォルダー内の各ユーザープロファイルのサイズを調べたい場合は、次のスクリプトが便利です。
gci -Force 'C:\Users' -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -Recurse -Force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$_.fullname, '{0:N2} GB' -f ($len / 1Gb)
}
ここで%はForeach-Objectループのエイリアスです。
システムドライブ直下の全フォルダーサイズを表形式で表示する
さらに応用してみましょう。システムドライブのルートにある各ディレクトリのサイズを求め、フォルダーサイズで並べ替えられる見やすい表形式で表示することを目指します。
C:\ドライブ上のディレクトリサイズ情報を取得するには、次のPowerShellスクリプトを実行します。
$targetfolder='C:\'
$dataColl = @()
gci -Force $targetfolder -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -Recurse -Force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$foldername = $_.fullname
$foldersize = '{0:N2}' -f ($len / 1Gb)
$dataObject = New-Object PSObject
Add-Member -inputObject $dataObject -memberType NoteProperty -name "foldername" -value $foldername
Add-Member -inputObject $dataObject -memberType NoteProperty -name "foldersizeGb" -value $foldersize
$dataColl += $dataObject
}
$dataColl | Out-GridView -Title "Size of subdirectories"
実行すると、グラフィカルな表が表示され、システムドライブC:\のルートにあるすべてのフォルダーとそのサイズを一覧できます(表はOut-GridViewコマンドレットによって生成されます)。列ヘッダーをクリックすれば、フォルダーをサイズ順に並べ替えることも可能です。また、結果をCSVファイル(| Export-Csv folder_size.csv)やExcelファイルにエクスポートすれば、報告資料としてもそのまま活用できます。
再利用しやすい関数として定義する(Get-FolderSize)
PowerShellスクリプトの中でフォルダーサイズのチェックを頻繁に行うなら、専用の関数として定義しておくと便利です。
function Get-FolderSize {
[CmdletBinding()]
Param (
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
$Path
)
if ( (Test-Path $Path) -and (Get-Item $Path).PSIsContainer ) {
$Measure = Get-ChildItem $Path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum
$Sum = '{0:N2}' -f ($Measure.Sum / 1Gb)
[PSCustomObject]@{
"Path" = $Path
"Size(GB)" = $Sum
}
}
}
関数を使用する際は、フォルダーのパスを引数として渡すだけです。
Get-FolderSize ('C:\PS')
リモートコンピューターのフォルダーサイズを確認する
自作した関数は、Invoke-Commandコマンドレット(PowerShell Remoting)と組み合わせれば、リモートコンピューター上のフォルダーサイズ確認にもそのまま利用できます。
Invoke-Command -ComputerName hq-srv01 -ScriptBlock ${Function:Get-FolderSize} -ArgumentList 'C:\PS'
まとめ
本記事で紹介したコマンドは、最新のPowerShell Core 7.xを含むすべてのバージョンのPowerShellで動作します。Get-ChildItemとMeasure-Objectを組み合わせるだけで、単純なフォルダーサイズの確認から、サブフォルダー別の一覧化、ハードリンクの除外、リモートサーバーでの調査まで幅広く対応できます。ディスク容量の管理やクリーンアップ作業に、ぜひ日々の運用に取り入れてみてください。
-
Windows 10でフォルダサイズを確認・表示する3つの方法
この記事では、Windows 10でフォルダサイズを表示・確認するための3つの方法をご紹介します。それぞれの方法の手順をわかりやすく解説し、目的に合った方法を選べるようにまとめました。Part 1:エクスプローラーの設定でフォルダサイズを表示する方法Part 2:プロパティからフォルダサイズを確認する方法Part 3:専用アプリを使ってフォルダサイズを表示する方法Part 1:エクスプローラーの設定でフォルダサイズを表示する方法まずは、Windows標準のエクスプローラー設定を変更して、フォルダにマウスカーソルを合わせたときにサイズ情報を表示させる方法です。以下の手順で設定できます。• ファイ
-
Windows 11でフォルダの使用容量を確認する3つの方法を徹底解説
パソコンの中でどのフォルダが最もドライブ容量を消費しているのかは、フォルダのストレージ使用状況を調べることで把握できます。容量を大きく占めるフォルダを特定できれば、アプリの削除やファイルの整理(圧縮も含む)を行い、ストレージを効率的に節約できます。 Windows 11では、複数の方法でフォルダのサイズを確認できます。エクスプローラー、コマンドプロンプト、設定アプリ、さらにサードパーティ製ツールなどを使えば、フォルダのサイズ情報を簡単にチェック可能です。本記事では、Windows 11でフォルダのストレージ使用量を確認する3つの方法をご紹介します。 Windows 11でフォルダの使用容量を確