local profile backupでは、表示名ではなくUSERPROFILE・destination volume・OneDrive状態を最初の対象キーにします。変更や集計へ進む前にrobocopy /L件数・free space・excluded pathsを保存し、別対象を同じ結果へ混ぜないことが出発点です。
合格条件はnew destinationへのrobocopy終了codeが0または1で、source/destinationの全file relative path・size・SHA-256とdirectory countが一致することです。sampleだけでは完全一致を宣言しません。
停止条件:既存destination・容量不足・使用中fileの扱いが不明。該当するときは操作を進めず、作成backupを隔離し原profileへ自動restoreしないを実行可能な形で確認してから再計画します。
local profile backup|完了像を先に言語化する:本実行rcが8未満でdestination件数とsample hashが一致する状態
robocopy.exeを実行できたこと自体は完了条件ではありません。ローカルプロファイルのバックアップのLiteralPath、ファイル種別、長さ、更新時刻、SHA-256が維持され、robocopy.exeで変更値と関連機能を確認できて初めて完了です。
ローカルプロファイルのバックアップの判断基準は対象パスの存在、件数、ハッシュ、コピー先を実行前後で比較することです。robocopy.exeがエラーを返す、対象が増減する、関連機能が使えない場合は合格にしません。
| 判断要素 | ローカルプロファイルのバックアップで記録する内容 |
| 対象の識別 | LiteralPath、ファイル種別、長さ、更新時刻、SHA-256 |
| 最初の確認 | Get-Item |
| 変更または操作 | robocopy.exe |
| 再確認 | robocopy.exe |
| 中止条件 | 対象のフルパスを一意にできず、既存データを上書きする可能性がある |
local profile backup|比較に使うbaselineを採る:robocopy /L件数・free space・excluded paths
ローカルプロファイルのバックアップの読み取り例を示します。最初は通常権限で試し、アクセス拒否が出た箇所だけ必要権限を確認します。
$source = [Environment]::GetFolderPath('UserProfile')
$destination = 'E:\ProfileBackups\' + $env:USERNAME + '-' + (Get-Date -Format 'yyyyMMdd-HHmmss')
if (-not (Test-Path -LiteralPath $source -PathType Container)) { throw 'Source profile is missing' }
if (Test-Path -LiteralPath $destination) { throw "Destination must not exist: $destination" }
$destinationParent = Split-Path -Parent $destination
if (-not (Test-Path -LiteralPath $destinationParent -PathType Container)) { throw 'Destination parent is missing' }
$sourceFull = [IO.Path]::GetFullPath($source); $destinationFull = [IO.Path]::GetFullPath($destination)
if ($destinationFull.StartsWith($sourceFull, [StringComparison]::OrdinalIgnoreCase)) { throw 'Destination cannot be inside source' }
$sourceBytes = (Get-ChildItem -LiteralPath $source -File -Recurse -Force -ErrorAction Stop | Measure-Object Length -Sum).Sum
$drive = Get-PSDrive -Name ([IO.Path]::GetPathRoot($destinationFull).TrimEnd('\').TrimEnd(':')) -ErrorAction Stop
if ($drive.Free -lt ($sourceBytes * 1.2)) { throw 'Insufficient free space with 20 percent margin' }
[pscustomobject]@{ Source=$sourceFull; Destination=$destinationFull; SourceBytes=$sourceBytes; FreeBytes=$drive.Free; DestinationExists=$false }
Get-Itemの結果は対象パスの存在、件数、ハッシュ、コピー先を実行前後で比較する順に読みます。件数、固有ID、状態、取得時刻を保存すると、後のrobocopy.exeと比較できます。
local profile backup|接続先とscopeを確定する:USERPROFILE・destination volume・OneDrive状態
ローカルプロファイルのバックアップで使うPowerShellの版は $PSVersionTable で、コマンドの提供元は Get-Command Get-Item で確認します。本人データは通常ユーザー。全プロファイルは管理者。対象候補が複数ならLiteralPath、ファイル種別、長さ、更新時刻、SHA-256を使い、表示名の部分一致だけで選びません(ローカルプロファイルのバックアップの判断では「プロファイル全体の単純コピーは使用中ファイル、OneDrive、メールキャッシュ、ACLを完全保護しない」を優先し、robocopy.exeが空なら成功扱いしません)。
- ローカルプロファイルのバックアップ: 実行端末と現在ユーザーを記録する
- Get-Item: Source、Version、利用可能なパラメーターを確認する
- LiteralPath、ファイル種別、長さ、更新時刻、SHA-256: 変更前の値を日時付きで保存する
- 元ファイルの別名コピー、ハッシュ、ACL、宛先の既存有無: 復旧に使えることを読み取り確認する
- 対象のフルパスを一意にできず、既存データを上書きする可能性がある: 該当すれば本番実行を見送る
ローカルプロファイルのバックアップ対象はDocumentsなどの利用者データとし、使用中キャッシュ、メールデータ、OneDriveのオンライン専用項目を別分類にします。コピー前にUSERPROFILE、除外パス、保存先容量を記録し、単純コピーを完全なプロファイル復元手段と呼びません。ブラウザー資格情報や暗号化鍵はユーザーデータのコピーだけでは復元できないため、製品別のエクスポート手順と回復キーを別途確認します。ジャンクションは追跡せず循環コピーを防ぎます。
バックアップ前にsourceとdestinationの完全パス、除外directory、既存destination、必要空き容量を確認します。上書き対象を一意にできない、またはdestinationがsource配下にある場合はrobocopyを開始しません。
「PowerShellの基本的な操作」はローカルプロファイルのバックアップの対象範囲を決める論点です。Get-Itemの前にPowerShellの基本的な操作の現在状態を確認し、LiteralPath、ファイル種別、長さ、更新時刻、SHA-256と対応付けます。
ローカルプロファイルのバックアップで「ローカルプロファイルのバックアップ方法」を扱うときは、ローカルプロファイルのバックアップ方法の表示名だけでなくLiteralPath、ファイル種別、長さ、更新時刻、SHA-256を記録します。robocopy.exeでも同じ対象が返ることを確かめます。
検証は除外後の全fileを対象にGet-FileHashでmanifest化します。大容量では時間がかかるため、maintenance windowと保存先容量を先に確保します。
Get-Itemはローカルプロファイルのバックアップの1番目の確認手段です。Get-Help Get-Item -Fullで利用できるパラメーターを調べ、出力型と対象件数を記録します。
ローカルプロファイルのバックアップの検証ではTest-Pathが返すオブジェクトを文字列だけに変換せず、固有IDと状態列を残します。後段の比較に使えるためです。
Get-Volumeへ渡す対象はLiteralPath、ファイル種別、長さ、更新時刻、SHA-256で一意にします。ローカルプロファイルのバックアップの表示名だけを部分一致させて複数件を処理しません。
ローカルプロファイルのバックアップでSelect-Objectを使う前に、Get-Command Select-ObjectでSourceとVersionを確認します。別モジュールの同名コマンドを実行しないためです。
local profile backup|失敗後に使う証拠を確保する:作成backupを隔離し原profileへ自動restoreしない
ローカルプロファイルのバックアップの変更前には元ファイルの別名コピー、ハッシュ、ACL、宛先の既存有無を保存します。保存したファイルや値が実際に読めることを確認し、同じ端末内の上書きだけをバックアップと呼びません(ローカルプロファイルのバックアップでは本人データは通常ユーザーの範囲でGet-Itemが返す固有値を基準にします)。
local profile backup|影響を一対象へ閉じ込める:USERPROFILE・destination volume・OneDrive状態
ローカルプロファイルのバックアップでrobocopy.exeを使う例は一対象に限定しています。WhatIfを利用できる場合は先に対象を表示し、外部コマンドでは読み取りオプションか検証端末を使います(ローカルプロファイルのバックアップの判断では「プロファイル全体の単純コピーは使用中ファイル、OneDrive、メールキャッシュ、ACLを完全保護しない」を優先し、robocopy.exeが空なら成功扱いしません)。
$preview = & robocopy.exe $source $destination /E /L /XJ /R:1 /W:1 /COPY:DAT /DCOPY:DAT /XD AppData\Local\Temp 2>&1
$previewExit = $LASTEXITCODE
$preview | ForEach-Object { Write-Host $_ }
if ($previewExit -ge 8) { throw "robocopy preview failed: $previewExit" }
if (Test-Path -LiteralPath $destination) { throw 'Preview unexpectedly created or destination appeared' }
if ((Read-Host "After reviewing /L and capacity, type COPY-NEW-DESTINATION") -cne 'COPY-NEW-DESTINATION') { throw 'Cancelled' }
if (Test-Path -LiteralPath $destination) { throw 'Destination appeared after approval' }
$copyOutput = & robocopy.exe $source $destination /E /XJ /R:1 /W:1 /COPY:DAT /DCOPY:DAT /XD AppData\Local\Temp 2>&1
$copyExit = $LASTEXITCODE
$copyOutput | ForEach-Object { Write-Host $_ }
if ($copyExit -notin @(0,1)) { throw "Exact-copy contract rejected robocopy exit code $copyExit" }
プロファイル全体の単純コピーは使用中ファイル、OneDrive、メールキャッシュ、ACLを完全保護しない。業務データの正式バックアップと分ける。 そのため、robocopy.exeの結果が期待どおりでも環境固有の制約を再確認します。
local profile backup|期待値と実測を突き合わせる:本実行rcが8未満でdestination件数とsample hashが一致する状態
robocopy.exeでは、変更前に保存したLiteralPath、ファイル種別、長さ、更新時刻、SHA-256と同じ対象を選びます。対象パスの存在、件数、ハッシュ、コピー先を実行前後で比較することで、別スコープの値を成功結果として採用しません(ローカルプロファイルのバックアップでは本人データは通常ユーザーの範囲でGet-Itemが返す固有値を基準にします)。
$excludedRoot = Join-Path $source 'AppData\Local\Temp'
$sourceFiles = @(Get-ChildItem -LiteralPath $source -File -Recurse -Force -ErrorAction Stop | Where-Object { -not $_.FullName.StartsWith($excludedRoot, [StringComparison]::OrdinalIgnoreCase) })
$sourceManifest = foreach ($sourceFile in $sourceFiles) {
$relative = $sourceFile.FullName.Substring($source.TrimEnd('\').Length).TrimStart('\')
[pscustomobject]@{ Relative=$relative; Length=$sourceFile.Length; SHA256=(Get-FileHash -LiteralPath $sourceFile.FullName -Algorithm SHA256 -ErrorAction Stop).Hash }
}
$destinationFiles = @(Get-ChildItem -LiteralPath $destination -File -Recurse -Force -ErrorAction Stop)
$destinationManifest = foreach ($destinationFileInfo in $destinationFiles) {
$relative = $destinationFileInfo.FullName.Substring($destination.TrimEnd('\').Length).TrimStart('\')
$destinationFile = $destinationFileInfo.FullName
[pscustomobject]@{ Relative=$relative; Length=$destinationFileInfo.Length; SHA256=(Get-FileHash -LiteralPath $destinationFile -Algorithm SHA256 -ErrorAction Stop).Hash }
}
$sourceJson = @($sourceManifest | Sort-Object Relative | ConvertTo-Json -Depth 3 -Compress)
$destinationJson = @($destinationManifest | Sort-Object Relative | ConvertTo-Json -Depth 3 -Compress)
if ($sourceJson -ne $destinationJson) { throw 'Full relative-path/size/SHA-256 manifest mismatch' }
$sourceDirs = @(Get-ChildItem -LiteralPath $source -Directory -Recurse -Force | Where-Object { -not $_.FullName.StartsWith($excludedRoot, [StringComparison]::OrdinalIgnoreCase) }).Count
$destinationDirs = @(Get-ChildItem -LiteralPath $destination -Directory -Recurse -Force).Count
if ($sourceDirs -ne $destinationDirs) { throw 'Directory count mismatch' }
[pscustomobject]@{ RobocopyExit=$copyExit; Files=$sourceManifest.Count; Directories=$sourceDirs; FullManifestVerified=$true }
- robocopy.exe: 同じ対象IDを再取得できた
- ローカルプロファイルのバックアップ: 意図した値または件数だけが変化した
- 対象パスの存在、件数、ハッシュ、コピー先を実行前後で比較する: 関連機能も異常がない
- パスの誤記、アクセス拒否、ジャンクション、オンライン専用ファイル: 取得失敗をゼロ件として扱っていない(ローカルプロファイルのバックアップの判断では「プロファイル全体の単純コピーは使用中ファイル、OneDrive、メールキャッシュ、ACLを完全保護しない」を優先し、robocopy.exeが空なら成功扱いしません)。
- プロファイル全体の単純コピーは使用中ファイル、OneDrive、メールキャッシュ、ACLを完全保護しない。業務データの正式バックアップと分ける。: 環境固有の制約に反していない
local profile backup|権限や到達性の不足で中断する:既存destination・容量不足・使用中fileの扱いが不明
ローカルプロファイルのバックアップでアクセス拒否が出た場合は、すぐ管理者として再実行せず本人データは通常ユーザー。全プロファイルは管理者という必要範囲を確認します。対象側のACLや管理ロールも分けて調べます。
ローカルプロファイルのバックアップが時間経過後に元へ戻る場合は、GPO/MDM、同期、サービス再起動、別スコープを調べます。繰り返し上書きして管理設定と競合させません。
ローカルプロファイルのバックアップで予想外の警告が一件でも出たら、対象数と時刻を記録して停止します。別の設定変更で警告を相殺しようとしません。
local profile backup|保存値から原状を再構成する:作成backupを隔離し原profileへ自動restoreしない
まず/Lで差分を確認する。復元は別ユーザーまたはWindows回復環境で、上書き対象とACLを確認しながら必要フォルダーだけ戻す。
ローカルプロファイルのバックアップを戻した後はGet-Itemとrobocopy.exeを再実行し、LiteralPath、ファイル種別、長さ、更新時刻、SHA-256が変更前記録と一致することを確認します。復旧処理にも失敗したら連続操作を止め、保存した元ファイルの別名コピー、ハッシュ、ACL、宛先の既存有無とログを担当者へ渡します(ローカルプロファイルのバックアップでは本人データは通常ユーザーの範囲でGet-Itemが返す固有値を基準にします)。
local profile backup|秘密値を除いて運用へ渡す:robocopy /L件数・free space・excluded paths
- Get-Itemの実行時刻、対象件数、エラー件数を残した
- LiteralPath、ファイル種別、長さ、更新時刻、SHA-256で対象を一意に特定した
- 元ファイルの別名コピー、ハッシュ、ACL、宛先の既存有無を変更前に保存して読めることを確認した
- robocopy.exeの対象を一端末・一ユーザー・一設定に限定した
- robocopy.exeと実利用テストの両方を確認した
- 対象のフルパスを一意にできず、既存データを上書きする可能性がある場合は実行を中止した
断定できません。ローカルプロファイルのバックアップではパスの誤記、アクセス拒否、ジャンクション、オンライン専用ファイルでも空になります。エラーを表示し、権限とスコープを確認してからrobocopy.exeまたは別の公式な取得方法で照合します。
local profile backup|迷いやすい判断を先に解く:単純copyだけで完全restoreできるか
権限だけが原因とは限りません。プロファイル全体の単純コピーは使用中ファイル、OneDrive、メールキャッシュ、ACLを完全保護しない。業務データの正式バックアップと分ける。 対象のフルパスを一意にできず、既存データを上書きする可能性があるなら昇格して続行せず、対応Edition、対象ID、ポリシー、復旧経路を確認します(ローカルプロファイルのバックアップの判断では「プロファイル全体の単純コピーは使用中ファイル、OneDrive、メールキャッシュ、ACLを完全保護しない」を優先し、robocopy.exeが空なら成功扱いしません)。

コメント