はじめに
「各フォルダサイズがどのくらいのサイズか測っといて」とよく言われることがあります。
手段として、Explorerから一個一個確認するのは面倒ですし、Explorerの設定をいじって表示させるようにしたりすると時間がかかり重くなるので、Powershellでスクリプトを作成することにしました。
フォルダサイズ計測スクリプト
カレントディレクトリの合計
# ディレクトリのパスを指定します。現在のディレクトリを指定しています。
$dirPath = "./"
# 合計サイズを保存するための変数を0で初期化します。
$totalSize = 0
# Get-ChildItem コマンドを使って、指定したディレクトリ内のすべてのアイテムを取得します。
Get-ChildItem $dirPath -File -Recurse | ForEach-Object {
try {
# ファイルのサイズ($_Length)をMB単位で取得し、それを合計サイズに加算します。
$totalSize += $_.Length / 1MB
} catch {
# エラーが発生した場合の処理です。
if ($_.Exception -is [System.UnauthorizedAccessException]) {
Write-Host "-Error: Access is denied $($_.FullName)"
} elseif ($_.Exception -is [System.IO.IOException]) {
Write-Host "$($_.FullName) -Error: The directory is in use."
} else {
Write-Host "$($_.FullName) -Error: An unexpected error occurred."
}
}
}
# 桁数2で丸め
$totalSize = [Math]::Round($totalSize, 2, [System.MidpointRounding]::AwayFromZero)
# 合計サイズを出力します。
"$totalSize MB Total size"
サブフォルダの合計
$dirPath = "./" # カレントディレクトリを指定
$parentPath = (Get-Item -Path ".\").FullName # 親ディレクトリのパスを取得
$sizeInfo = Get-ChildItem -Path $dirPath -Directory | ForEach-Object {
# サブディレクトリのサイズを計算するための変数を初期化
$subDirSize = 0
# サブディレクトリのパスから親ディレクトリのパスを除いた結果を取得
$subDirPath = $_.FullName.Replace($parentPath, "").TrimStart("\")
# サブディレクトリ内のファイルを再帰的に取得し、サイズを計算
Get-ChildItem $_.FullName -File -Recurse | ForEach-Object {
$subDirSize += $_.Length / 1MB
}
# サイズを桁数4で丸める
$subDirSize = [Math]::Round($subDirSize, 4, [System.MidpointRounding]::AwayFromZero)
# サブディレクトリのパスとそのサイズをカスタムオブジェクトに格納
[PSCustomObject]@{
SubDirectory = $subDirPath
Size = $subDirSize
}
}
# サブディレクトリの情報をテーブル形式で出力
$sizeInfo | Format-Table -AutoSize
結果
上記のコードをPowershellにコピペするか、ps1にして実行するとこんな感じで出てきます。
PS C:\Users\hoge> & .\11_PowerShell\sizeCal3.ps1
87.81 MB Total size
SubDirectory Size
------------ ----
00_DevelopMind 2.9315
01_work 0.0105
02_Article 0.0174
03_Excel 0.0003
04_MS_Graph 0.0679
06_ExchangeOnline 0.0446
07_Architecture 0.0021
08_dotnet 0.0017
09_MS 0.0033
10_Test 2.0159
11_PowerShell 0.0109
12_Tools 2.3041
13_Vim 0
14_DevOps 0.0861
15_git 0.0015
16_C# 80.2899
最後に
Shellが一番良いのは理解していますが、PowershellでWindowsを自動化するのも結構ありなのでは、と最近は思っています。(Windowsを使用していてwslを使用できない環境の場合)