PowerShellを用いてユーザープロファイルのサイズを確認する方法

PowerShellを用いてユーザープロファイルのサイズを確認する方法という問いには、対象SIDからLocalPathを確定し、再帰列挙の件数、合計バイト、エラーを分けて集計するという方法で答えます。プロファイル容量は列挙できたファイルLengthの合計で、クラウドプレースホルダー、圧縮、ディスク上の割当サイズとは一致しない。Loadedなプロファイルは使用中ファイルもある。この記事ではWin32_UserProfileのSIDとLocalPath、Loaded、Specialを確認し、C:Usersの表示名だけに頼らないを判断軸にし、実行前の確認、記事固有のコード、合否判定、戻し方を一続きで示します。

任意ディレクトリのseq9より、SIDと特殊プロファイルを考慮したユーザー領域の診断に特化する。完了は「対象SIDとLocalPath、取得時刻、ファイル数、論理サイズ、エラー件数がそろい、比較条件を説明できる」と定義します。対象が取れない場合は「0件ならSpecialプロファイル、パス不存在、アクセス拒否、クラウド状態を確認し、空プロファイルと断定しない」として切り分け、推測で成功扱いにしません。

目次

対象プロファイルをSIDとパスで決める

対象SIDからLocalPathを確定し、再帰列挙の件数、合計バイト、エラーを分けて集計する。ユーザープロファイルの容量確認ではこの進め方により、操作したという事実ではなく、期待する状態へ到達したかでタイトルの問いへ答えられます。任意ディレクトリのseq9より、SIDと特殊プロファイルを考慮したユーザー領域の診断に特化する。

対象プロファイルをSIDとパスで決めるの合格条件は、対象SIDとLocalPath、取得時刻、ファイル数、論理サイズ、エラー件数がそろい、比較条件を説明できることです。作業時刻、実行ユーザー、端末名を添え、判断に使った値が後から追える形にします。

NTUSER.DATを含むファイルを列挙

NTUSER.DATを含むファイルを列挙では、ユーザープロファイルの容量確認の対象を「Win32_UserProfileのSIDとLocalPath、Loaded、Specialを確認し、C:Usersの表示名だけに頼らない」という単位で扱います。プロファイル容量は列挙できたファイルLengthの合計で、クラウドプレースホルダー、圧縮、ディスク上の割当サイズとは一致しない。Loadedなプロファイルは使用中ファイルもある。対象が複数なら表示名の部分一致で先頭を採らず、一意になる条件を追加します。

ユーザープロファイルの容量確認を始める前に、PowerShellの版、コマンドの提供元、必要権限、管理ポリシーの有無を確認します。権限不足と対象なしは意味が異なるため、例外を0件へ置き換えません。

アクセス拒否を欠落として記録

アクセス拒否を欠落として記録は変更前の基準点です。Win32_UserProfileのSIDとLocalPath、Loaded、Specialを確認し、C:Usersの表示名だけに頼らないを出力に含め、取得時刻と一緒に保存します。値だけを切り取ると別対象との比較になるため、識別列を省きません。

$currentSid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
$requestedSid = Read-Host "対象ユーザーのSIDを入力(現在のユーザー $currentSid はEnter)"
$targetSid = if ([string]::IsNullOrWhiteSpace($requestedSid)) { $currentSid } else { $requestedSid.Trim() }
if ($targetSid -notmatch '^S-1-5-(?:\d+-){1,14}\d+$') { throw "SID形式が不正です: $targetSid" }
$profiles = @(Get-CimInstance Win32_UserProfile -ErrorAction Stop |
  Where-Object SID -eq $targetSid)
if ($profiles.Count -ne 1) { throw "SIDに対応するプロファイルを一意にできません: $($profiles.Count)件" }
$profile = $profiles[0]
if ($profile.Special) { throw 'Specialプロファイルは対象外です。' }
if (-not (Test-Path -LiteralPath $profile.LocalPath -PathType Container)) {
  throw "LocalPathが存在しません: $($profile.LocalPath)"
}
$profile | Select-Object SID, LocalPath, Loaded, Special, LastUseTime

プロファイル容量は列挙できたファイルLengthの合計で、クラウドプレースホルダー、圧縮、ディスク上の割当サイズとは一致しない。Loadedなプロファイルは使用中ファイルもある。出力が多い場合も最初から無理に一件へ絞らず、候補数と除外理由を残してから対象を決めます。

OneDriveのオンライン専用を理解

OneDriveのオンライン専用を理解では、対象SIDからLocalPathを確定し、再帰列挙の件数、合計バイト、エラーを分けて集計する。ユーザープロファイルの容量確認の例中にある名前、パス、ID、時刻はサンプルなので、そのまま本番へ貼らず、直前の読み取り結果から承認値を入れます。

$enumerationErrors = @()
$files = @(Get-ChildItem -LiteralPath $profile.LocalPath -File -Force -Recurse -ErrorAction SilentlyContinue -ErrorVariable +enumerationErrors)
$measure = $files | Measure-Object Length -Sum
$profileSummary = [pscustomobject]@{
  SID=$profile.SID; LocalPath=$profile.LocalPath; Loaded=$profile.Loaded
  CollectedAt=Get-Date; Files=$measure.Count; Bytes=[int64]$measure.Sum
  GiB=[math]::Round([double]$measure.Sum / 1GB, 3)
  ErrorCount=$enumerationErrors.Count; Complete=($enumerationErrors.Count -eq 0)
}
$profileSummary
if ($enumerationErrors.Count) {
  $enumerationErrors | Select-Object @{n='Target';e={$_.TargetObject}},
    FullyQualifiedErrorId, @{n='Message';e={$_.Exception.Message}}
}

容量が大きいという理由だけでAppDataやNTUSER.DATを削除しない。ログオン中のユーザーへの負荷も考慮する。ユーザープロファイルの容量確認でプレビュー対応コマンドを使える場合はWhatIfを先に実行し、非対応の操作は対象一覧と引数を画面へ出して人が承認してから一度だけ実行します。

使用中ファイルと再解析ポイント

使用中ファイルと再解析ポイントでは同じ対象を別経路でもう一度読みます。判定したいのは「コマンドが終了したか」ではなく、対象SIDとLocalPath、取得時刻、ファイル数、論理サイズ、エラー件数がそろい、比較条件を説明できるかどうかです。

$rootPrefix = $profile.LocalPath.TrimEnd('\') + '\'
$files | Group-Object {
  $relative = $_.FullName.Substring($rootPrefix.Length)
  ($relative -split '\\', 2)[0]
} | ForEach-Object {
  $m = $_.Group | Measure-Object Length -Sum
  [pscustomobject]@{ Folder=$_.Name; Files=$m.Count; Bytes=[int64]$m.Sum }
} | Sort-Object Bytes -Descending
if (-not $profileSummary.Complete) {
  Write-Warning 'アクセス不能項目があるためプロファイル合計は下限値です。'
}

0件ならSpecialプロファイル、パス不存在、アクセス拒否、クラウド状態を確認し、空プロファイルと断定しない。ユーザープロファイルの容量確認の期待値と実測値が一致しないときは追加変更を重ねず、対象識別、権限、ポリシー、時間差の順で原因を分けます。

容量が大きい直下フォルダーを絞る

容量が大きいという理由だけでAppDataやNTUSER.DATを削除しない。ログオン中のユーザーへの負荷も考慮する。容量が大きい直下フォルダーを絞るに該当したら、警告を消して継続するのではなく、どの条件で止まったかを記録します。

0件ならSpecialプロファイル、パス不存在、アクセス拒否、クラウド状態を確認し、空プロファイルと断定しない。ユーザープロファイルの容量確認ではエラー本文、FullyQualifiedErrorId、対象ID、直前に成功した段階を残すと、別担当者が安全な地点から調査できます。

削除作業へ直結させない

直下フォルダー別に再集計し、Documents、Downloads、AppDataを用途別に報告する。ユーザープロファイルの容量確認を繰り返す場合は、正常、対象なし、要承認、失敗を異なる終了状態として記録し、前回値との比較だけで異常を決めません。

削除作業へ直結させないの識別軸Win32_UserProfileのSIDとLocalPath、Loaded、Specialを確認し、C:Usersの表示名だけに頼らない
採用する実測対象SIDとLocalPath、取得時刻、ファイル数、論理サイズ、エラー件数がそろい、比較条件を説明できる
0件時の扱い0件ならSpecialプロファイル、パス不存在、アクセス拒否、クラウド状態を確認し、空プロファイルと断定しない
保留にする兆候容量が大きいという理由だけでAppDataやNTUSER.DATを削除しない。ログオン中のユーザーへの負荷も考慮する

ユーザープロファイルの容量確認の実行記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外した候補と理由を同じ作業番号で残します。特に「Win32_UserProfileのSIDとLocalPath、Loaded、Specialを確認し、C:Usersの表示名だけに頼らない」を省くと、後日の再確認で別対象の値を比較するおそれがあります。画面コピーだけでなく、日時と端末名を含む構造化した出力も保存します。

PowerShellを用いてユーザープロファイルのサイズを確認する方法を定期手順へ組み込む場合も、初回は対話的に候補を確認します。正常時は「対象SIDとLocalPath、取得時刻、ファイル数、論理サイズ、エラー件数がそろい、比較条件を説明できる」、判定不能時は「0件ならSpecialプロファイル、パス不存在、アクセス拒否、クラウド状態を確認し、空プロファイルと断定しない」、中止時は「容量が大きいという理由だけでAppDataやNTUSER.DATを削除しない。ログオン中のユーザーへの負荷も考慮する」をそれぞれ別の結果として扱います。これにより、0件や例外を都合よく成功へ丸めず、次の担当者が同じ対象と条件で追試できます。

修正後コードの合格条件:C:\Usersの表示名や$env:USERPROFILEだけで対象を決めず、現在SIDを既定値としつつ別ユーザーSIDも入力できます。選んだSIDとWin32_UserProfile.LocalPathが一件に一致しSpecialでないことを必須にし、列挙できた件数・BytesとErrorCountを同じ結果にして、エラーがあれば合計は下限値とします。

公式情報・参考資料

ユーザープロファイルの容量確認で使うコマンド名、引数、対応環境は次のMicrosoft一次資料で確認しました。記事の確認日は2026年7月17日です。OSやモジュール更新後は、実行端末のGet-Helpと併せて再確認してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次