PowerShell と winget で業務PCをまるごと移行した記録

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枚 持って進めると、中断・再開しても迷わない

道具はどれも標準的なものばかりだが、効いたのはむしろ 「棚卸し → 分類 → 移行 → 検証」という順序 と、決定を記録し続ける台帳だった。台数が多いほど、この地味な段取りが効いてくる。