7
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

エンジニア3年目、2023年の開発を振り返るAdvent Calendar 2023

Day 11

Windowsで各フォルダサイズを爆速で計測する方法(Powershell)

Last updated at Posted at 2023-12-10

はじめに

「各フォルダサイズがどのくらいのサイズか測っといて」とよく言われることがあります。
手段として、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を使用できない環境の場合)

7
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?