はじめに
フォルダのサイズを取得するという記事では、フォルダが入れ子になっている場合、C#だと再帰処理を使わないとフォルダのサイズ(合計)を取得できないと書かれていました。
確かPowerShellだとユーザー自身が再帰を使わなくても入れ子のフォルダを取得できたはず...と思い、調べてみた結果を記事としてまとめてみました。
Get-ChildItemの活用
-
Get-ChildItem
というコマンドレットのパラメーターとして-Recurse
を付けると、指定したフォルダの中を再帰的に探索した結果を得ることが出来ます。 - これを使えば、ユーザー自身が再帰処理を書く必要は無さそうです。
- ただしフォルダ名は不要なので、ファイルのみを抽出する必要があります。
作成したコード
(Get-ChildItem C:\test -Recurse).FullName
実行結果
C:\test\test1
C:\test\test2
C:\test\test3
C:\test\a.txt
C:\test\b.txt
C:\test\c.txt
C:\test\test1\test1-1
C:\test\test1\test1-2
C:\test\test1\123.txt
C:\test\test1\test1-1\abc.txt
C:\test\test1\test1-1\def.txt
C:\test\test1\test1-2\xyz.txt
C:\test\test2\aaa.txt
C:\test\test3\bbb.txt
出来上がったコード
-
Get-ChildItem
で得られた結果(リスト)をループで回して、ファイルサイズ($file.Length
)を加算するだけのコードです。- 自分で再帰処理を書く必要がないので、コードがかなりスッキリした印象です。
-
Get-ChildItem
のパラメーターに-File
を加えると、ファイルのみを取得することができます。- これは非常に分かりやすく、なおかつありがたい機能でした。
- エクスプローラーの表示と同じ「45628バイト」を求めることが出来ました。
作成したコード
$targetFolder = "C:\test"
$fileList = (Get-ChildItem $targetFolder -Recurse -File)
$fileSize = 0
foreach($file in $fileList) {
#Write-Host "$($file.FullName): $($file.Length)"
$fileSize += $file.Length
}
Write-Host "$($targetFolder)のサイズは$($fileSize)バイトです。"
実行結果
C:\testのサイズは45628バイトです。