PowerShell と winget で業務PCをまるごと移行した記録
2026/07/13
Y.M

社用PCの入れ替えで、旧PCから新PCへ開発・運用環境を移した。新PCはMDM管理下でのクリーンインストール前提。移行ツールでの丸ごと転送は使わず、必要なものだけを手で選んで移す方針にした。
数が多いので、行き当たりばったりではなく 「棚卸し → 分類 → 移行 → 検証」 の順で進めた。この記事では、その過程で効いた3つの道具立て——PowerShellでの棚卸し、wingetでのアプリ移行、WSLのtar移行——をまとめる。
1. PowerShell で「今の環境」を棚卸しする
移行で一番怖いのは、入れ忘れと設定し忘れ。まず現状を機械的に吐き出しておくと、あとから突き合わせできる。勘に頼らず、CSVやテキストに落とすのがポイント。
インストール済みアプリ(wingetで拾えない分も含めて、レジストリから):
$keys = @(
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall*',
'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall*',
'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall*'
)
Get-ItemProperty $keys | Where-Object { $_.DisplayName } |
Select-Object DisplayName, DisplayVersion, Publisher |
Export-Csv installed-programs.csv -NoTypeInformation -Encoding UTF8
環境変数・PATH、有効なWindowsの機能、資格情報の「所在」なども同じ要領で吐き出す:
# 有効なWindowsの機能(Hyper-V / WSL / Sandbox などの有無を確定)
Get-CimInstance Win32_OptionalFeature | Where-Object InstallState -eq 1 | Select-Object Name
資格情報は「どこに何があるか」だけ。中身や秘密鍵は出さない
cmdkey /list
コツは、点で拾うのではなく あとで種別に分類できる形で吐き出すこと。たとえばインストール済み一覧は、次章のように「自動で入るランタイム」と「自分で入れたソフト」に仕分ける前提で眺める。この視点があると、次のwingetの工程が一気に楽になる。
2. winget でアプリの大半を移行する
アプリの再導入はwingetが主役。旧PCで一覧をエクスポートし、新PCでインポートするだけで大半が入る。
# 旧PC
winget export -o packages.json –include-versions
新PC
winget import -i packages.json --accept-package-agreements --accept-source-agreements --ignore-unavailable</code></pre><p>ただし、エクスポートをそのまま流すと過不足が出る。ここで効くのが <strong>種別の切り分け</strong> だ。</p><p></p><ul><li><strong>ランタイム / 再頒布可能</strong>(VCRedist、.NETランタイム、各種AppRuntime など)… 他アプリの依存として自動的に入るので、明示リストからは外してよい</li><li><strong>ユーザーが意図して入れたソフト</strong> … これがインポートの本体</li><li><strong>winget非対応</strong>(インストーラが個別配布のもの)… 別に手動リストとして管理</li></ul><p></p><p>「これはVCRedistのような自動で入る部品なのか、自分で入れたアプリなのか」を分けておくと、インポートリストが素直になり、要らないものを新PCに持ち込まずに済む。ハードウェア固有のドライバや旧PCメーカーのOEMユーティリティも、この段階で「持ち込まない」に振り分けておく。新PCには新PCのドライバがある。</p><p></p><p>結果として、エクスポートされた一覧を精査して不要分を落とした「導入用リスト」を1つ用意し、それを新PCでwinget import`する、という流れに落ち着いた。
3. WSL は tar で丸ごと運ぶ
開発環境をWSLに寄せているなら、これがtar一発で運べるのが大きい。ディストリ単位でエクスポート/インポートできる。
# 旧PC:整合性のため必ず停止してから
wsl –shutdown
wsl –export Ubuntu-Dev "Ubuntu-Dev.tar"
新PC:配置先を指定してインポート
wsl –import Ubuntu-Dev "D:\WSL\Ubuntu-Dev" "Ubuntu-Dev.tar"
実務でつまずいた/助かった細かい点をいくつか。
- export前に
wsl –shutdown。中でSQLite等が動いていると、書き込み中のファイルが不整合なまま固まる恐れがある。停止してからならクリーンなスナップショットになる。 - エクスポート中に
pax format cannot archive sockets という警告が出ることがある。これは /tmp のIPCソケットが格納できずスキップされているだけで無害。コードもデータも入っている。 - 既定ユーザーは基本保たれる。「
wsl --import は既定ユーザーがrootになる」とよく言われるが、tarに /etc ごと含まれるため、旧環境の通常ユーザーがそのまま既定になった。環境によるので、起動後に wsl -d <名前> – whoami で確認しておくと安心。 - ディスクの空きが乏しいときは、tarをローカルに書かず、転送先へ直接書き出すと容量を食わない。今回は旧新2台をネットワークで直結し、新PC側のドライブへ直接exportした。
補足として、ダウンロードフォルダのような 細かいファイルが大量にある領域は、robocopyより7-Zipで1アーカイブにまとめて運ぶ方が、ネットワーク往復が減って速い。
7z a -mx=1 Downloads.7z "$env:USERPROFILE\Downloads*"
(-mx=1 は軽く圧縮しつつ最速寄りの設定。中身に圧縮済みファイルが多いなら十分。)
まとめ
- PowerShellで先に棚卸し して、種別で分類しておくと入れ忘れが減る
- wingetでアプリの大半は移行できる。ランタイムとユーザー導入ソフトを分けるのがコツ
- WSLはtarで丸ごと運べる。停止してからexport、既定ユーザーは基本保たれる
- 決定と結果を書き足す 作業台帳を1枚 持って進めると、中断・再開しても迷わない
道具はどれも標準的なものばかりだが、効いたのはむしろ 「棚卸し → 分類 → 移行 → 検証」という順序 と、決定を記録し続ける台帳だった。台数が多いほど、この地味な段取りが効いてくる。