🐷

ストレージを圧迫しているファイル・フォルダをPowershellで見つけ出す

2024/12/12に公開

0.ストレージの空き容量が足りないときに

利用しているPCの空き容量が足りない。
OSやアプリのTempフォルダの中身をすべて消しても足りない。
大容量ストレージを持つ新しいPCへの交換はすぐには実現できず、かといって外付けストレージもセキュリティ上の理由で利用できない。
なんとか不要ファイルを削除してストレージの空き容量を増やすしかないものの、「サイズの大きいファイル」を人力で探し出すには時間がかかる……
そのような状況で使える、「Powershellを利用して大きなサイズのファイルやフォルダを探す方法」を記録しておきます。
 ※この記事は Windows11 かつ PSVersion5.1 で動作確認しています

1.Powershellスクリプト実行方法

本記事で想定しているスクリプトの実行方法を先に記載しておきます。

まず、本記事の2.以降で出てくるコードをメモ帳に貼り付けてください。
その後、拡張子を「ps1」に、文字コードを「ANSI」にして「(任意のファイル名).ps1」として保存してください。

先ほどps1ファイルを保存したフォルダを開き、Shift + 右クリックから「PowerShellウィンドウをここで開く」を選択してPowerShellを起動します。

その後、起動したPowerShellウィンドウ内に以下のコードをコピペしてPowershellの実行ポリシーを変更してください。
 ※デフォルトの設定ではPowerShellスクリプトが実行できないので、今回のプロセスに限り実行できるようコード内でPowerShell実行ポリシーを変更しています
 ※Powershellのウィンドウを閉じてしまった場合、再度以下のコードをコピペしてください。

# 現在の実行ポリシーを取得する。
Get-ExecutionPolicy -List

# このプロセスでのみPowerShellスクリプトを実行できるように
# 実行ポリシーを変更する。
Set-ExecutionPolicy RemoteSigned -Scope Process

# 実行ポリシーを毎回変更するのが手間であれば
# スコープをプロセスではなくユーザにすれば以降は変更不要。
# Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

# 実行ポリシーの変更が反映されていることを確認する。
Get-ExecutionPolicy -List

最後に、起動したPowerShellウィンドウ内で、ファイル名だけ先ほど保存したものに変更してps1ファイルを実行してください。

# 先ほど保存したスクリプトを実行する。
./(任意のファイル名).ps1

以上でファイルに保存したスクリプトが実行されます。

2.サイズを指定してファイル検索する

100MBを超えるような不要ファイルをまとめて消せると一番手っ取り早いかと思います。

以下のコードでは、指定したフォルダの配下にあるファイルのうち、
「指定したサイズよりも大きいサイズのファイル」を一覧表示します。

コードのコメントにある(1)(2)を変更後、ps1ファイルとして保存し実行してください。
(2)についてはサイズの単位として GB, MB, KB が指定可能です。

# (1)検索対象のフォルダを指定する
$targetFolder = "C:\XXXXXX"

# (2)サイズの閾値を設定する
$sizeThreshold = 1GB

# 以降は編集不要
# 単位変換用関数
function Get-ReadableSize {
    param ([long]$sizeInBytes)

    if ($sizeInBytes -ge 1GB) {
        return "{0:N2} GB" -f ($sizeInBytes / 1GB)
    } elseif ($sizeInBytes -ge 1MB) {
        return "{0:N2} MB" -f ($sizeInBytes / 1MB)
    } elseif ($sizeInBytes -ge 1KB) {
        return "{0:N2} KB" -f ($sizeInBytes / 1KB)
    } else {
        return "{0} Bytes" -f $sizeInBytes
    }
}

# フォルダが存在するかチェックする
if (-Not (Test-Path -Path $targetFolder -PathType Container)) {
    Write-Error "指定されたフォルダ '$targetFolder' は存在しません。"
    exit
}

# 指定したフォルダ内のすべてのファイルを検索する
$largeFiles = Get-ChildItem -Path $targetFolder -Recurse -File |
    Where-Object { $_.Length -ge $sizeThreshold }

# 検索結果を表示する
$readableThreshold = Get-ReadableSize -sizeInBytes $sizeThreshold
if ($largeFiles) {
    Write-Host "$readableThreshold 以上のファイル一覧:" -ForegroundColor Green
    $largeFiles | ForEach-Object {
        Write-Host "[ファイル名] $($_.Name)  [サイズ] $(Get-ReadableSize -sizeInBytes $_.Length), [パス] $($_.FullName)"
    }
} else {
    Write-Host "$readableThreshold 以上のファイルは見つかりませんでした。" -ForegroundColor Yellow
}

検索結果として表示されたファイルを取捨していけば、短時間でストレージの空き容量が確保できるはずです。

3.サイズを指定してフォルダ検索する

1つ1つのファイルサイズは小さくても、塵が積もって山になってしまったフォルダもあるかと思います。

以下のコードでは、指定したフォルダの配下にあるフォルダを検索し
「指定したサイズよりも大きいサイズのフォルダ」を一覧表示します。
ただし、この方法だと「大きいサイズのフォルダ」が深い階層にある場合、その上位にあるフォルダすべてが条件に合致してしまい検索結果が大量に出力されますのでご注意ください。
 ※前述のコードとほぼ同じ処理にも関わらず分けてあるのはそのためです

前述のコード同様、コメントにある(1)(2)を変更後、ps1ファイルとして保存し実行してください。
(2)についてはサイズの単位として GB, MB, KB が指定可能です。

# (1)検索対象のフォルダを指定する
$targetFolder = "C:\XXXXXX"

# (2)サイズの閾値を設定する
$sizeThreshold = 100MB

# 以降は編集不要
# 単位変換用関数
function Get-ReadableSize {
    param ([long]$sizeInBytes)

    if ($sizeInBytes -ge 1GB) {
        return "{0:N2} GB" -f ($sizeInBytes / 1GB)
    } elseif ($sizeInBytes -ge 1MB) {
        return "{0:N2} MB" -f ($sizeInBytes / 1MB)
    } elseif ($sizeInBytes -ge 1KB) {
        return "{0:N2} KB" -f ($sizeInBytes / 1KB)
    } else {
        return "{0} Bytes" -f $sizeInBytes
    }
}

# フォルダが存在するかチェックする
if (-Not (Test-Path -Path $targetFolder -PathType Container)) {
    Write-Error "指定されたフォルダ '$targetFolder' は存在しません。"
    exit
}

# 指定したフォルダ内のサブフォルダを再帰的に検索する
$largeFolders = Get-ChildItem -Path $targetFolder -Recurse -Directory | 
    Where-Object { 
        $folderSize = (Get-ChildItem -Path $_.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
        $folderSize -ge $sizeThreshold
    }

# 検索結果を表示する
$readableThreshold = Get-ReadableSize -sizeInBytes $sizeThreshold
if ($largeFolders) {
    Write-Host "$readableThreshold 以上のフォルダ一覧:" -ForegroundColor Green
    $largeFolders | ForEach-Object {
        # フォルダの合計サイズを計算
        $folderSize = (Get-ChildItem -Path $_.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum
        Write-Host "[フォルダ名] $($_.FullName)  [サイズ] $(Get-ReadableSize -sizeInBytes $folderSize)"
    }
} else {
    Write-Host "$readableThreshold 以上のフォルダは見つかりませんでした。" -ForegroundColor Yellow
}

大きなサイズのファイル削除のみでは十分な空き容量が確保できなかった場合、検索結果に表示されたフォルダを対象にファイルの取捨選択をすれば、効率良く空き容量が確保できるかと思います。

Discussion