はじめに:新PCへの移行トラブルを防ぐには?

近々パソコンの引っ越し(買い替え)をしようと思っています。ただ、お任せの引っ越しソフトでアプリや環境を丸ごと移行しようとすると、よく動作不具合が起きると聞いて不安になっています……。

パソコンを買い替える時って、環境の移行作業が一番大変ですよね。
結論から言うと、アプリ本体は新PCで「クリーンインストール」し、データと設定ファイルのみを移行するのが、最もトラブルが少なく動作も安定します。

なるほど。でも、いざ新PCを立ち上げた時に「旧PCにどんなアプリを入れていたか」を忘れちゃいそうなんですよね。それに、台数制限があるソフトのライセンスを解除し忘れて使えなくなったら困りますし……。
「今どんなアプリが入っているか」を一括で確認・リスト化できる良い方法はありませんか?

コントロールパネルや設定画面を開いて1つずつメモするのは大変だけど、PowerShell(またはコマンドプロンプト)で特定のコマンドを1回実行するだけで、インストール済みアプリとポータブルアプリの一覧をテキストファイルとして一括出力できますよ!
「インストール済みアプリ」と「ポータブルアプリ」の違い

ちなみに、「インストール済みアプリ」と「ポータブルアプリ」ってどう違うんですか?

良い質問だね。違いを簡単に整理するとこんな感じだよ。
- インストール済みアプリ:
インストーラー(setup.exeなど)を使ってPCに登録したアプリ。Windowsのレジストリや各種システムフォルダと深く結びついているため、フォルダをコピーするだけでは別のPCへ移動できない。
- ポータブルアプリ:
インストーラーを使わず、exeファイル単体(または指定フォルダ内)で動作するアプリ。システムとの依存関係が薄いため、フォルダごとUSBメモリ等にコピーするだけで別PCへ簡単に移動・復元できる。

なるほど!だからリスト化する時も、両方を漏れなく拾い出す必要があるんですね。
アプリ一覧が一括出力できる万能コマンド

それでは、コマンドプロンプト(またはPowerShell)に貼り付けて実行するコードを紹介するね。※コマンドプロンプトは Windowsキー + R を押し、cmd と入力してEnterを押せば立ち上がります。
コマンドの文法・意味を徹底解説
powershell -Command "$targetFolder = 'C:\Tools'; $regApps = Get-ItemProperty @('HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*','HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*','HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*') | Where-Object { $_.DisplayName -and $_.SystemComponent -ne 1 } | Select-Object @{N='Name';E={$_.DisplayName}}, @{N='Version';E={$_.DisplayVersion}}, @{N='Type';E={'Installed'}}; $portableApps = @(); if (Test-Path $targetFolder) { $portableApps = Get-ChildItem -Path $targetFolder -Recurse -Filter '*.exe' -ErrorAction SilentlyContinue | Where-Object { $_.Name -notmatch 'unins|setup|install|update' } | Select-Object @{N='Name';E={$_.Name}}, @{N='Version';E={'-'}}, @{N='Type';E={'Portable'}} }; ($regApps + $portableApps) | Sort-Object Name | Format-Table -AutoSize | Out-File -FilePath \"$env:USERPROFILE\Desktop\installed_apps_list.txt\""
すごく長いコマンドですね……!内部ではどんな処理を行っているんですか?

一見複雑に見えるけれど、やっていることを分解するとシンプルだよ。処理内容を表にまとめてみたよ。
| コマンド | 意味 |
|---|---|
| powershell -Command ” … “ | 「ここから先の内容をPowerShellプログラムとして実行してね」という命令。 |
| $targetFolder = ‘C:\Tools’; | ポータブルアプリを探したいフォルダパスを指定。 |
| $regApps = Get-ItemProperty @( ‘HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall*’, ‘HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall*’, ‘HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall*’ ) | Windowsのレジストリ情報から、全ユーザー用(64bit/32bit)およびログイン中ユーザー用のインストール済みアプリ情報を取得。 |
| | Where-Object { $.DisplayName -and $.SystemComponent -ne 1 } | アプリ名が存在し、かつWindows内部のシステム部品(裏方プログラム)ではないアプリだけを抽出。 |
| | Select-Object @{N=’Name’;E={$.DisplayName}}, @{N=’Version’;E={$.DisplayVersion}}, @{N=’Type’;E={‘Installed’}} | アプリ名(Name)、バージョン(Version)、種別(Type: Installed)の3項目に整理。 |
| $portableApps = @(); | ポータブルアプリ一覧を入れるための「空のリスト(配列)」を準備。 |
| if (Test-Path $targetFolder) { … } | 指定したフォルダ(例: C:\Tools)が存在する場合のみ検索処理を実行。 |
| Get-ChildItem -Path $targetFolder -Recurse -Filter ‘*.exe’ -ErrorAction SilentlyContinue | 指定フォルダとその傘下にあるサブフォルダ全体から .exe ファイルを全検索。 |
| | Where-Object { $_.Name -notmatch ‘unins|setup|install|update’ } | 見つかった .exe のうち、アンインストーラーやセットアップ用の不要ファイルを自動除外。 |
| | Select-Object @{N=’Name’;E={$_.Name}}, @{N=’Version’;E={‘-‘}}, @{N=’Type’;E={‘Portable’}} | アプリ名(Name)、バージョン(Type指定なしのため -)、種別(Type: Portable)に整理。 |
| ($regApps + $portableApps) | 通常アプリとポータブルアプリの2つのリストを1つに結合。 |
| | Sort-Object Name | アプリ名の五十音・アルファベット順に並べ替え。 |
| | Format-Table -AutoSize | 画面やテキストで見やすいよう、列幅を自動調整した表形式に整列。 |
| | Out-File -FilePath “$env:USERPROFILE\Desktop\installed_apps_list.txt” | 完成した表をデスクトップ上の installed_apps_list.txt に保存。 |
自分に合わせてカスタマイズする方法

このコードをそのままコピー&ペーストすれば使えますか?

基本的にはそのままでも動くけれど、各自の環境に合わせて2箇所書き換えるのがおすすめだよ。
ポータブルアプリの保存場所($targetFolder)

標準では 'C:\Tools' になっているけれど、自分がポータブルアプリや独自ダウンロードしたソフトをまとめているフォルダパスに変更しよう。

自分の場合は、ダウンロード関連のファイルをまとめている場所を指定してみました。
(※シングルクォーテーション ' ' の間を自分の環境のパスに書き換えます)
$targetFolder = 'C:\前崎江モール\ダウンロードしたアプリ';リスト出力先とファイル名(-FilePath)

標準ではデスクトップ上に installed_apps_list.txt として保存される設定になっているよ。別の場所や別の名前で保存したい場合はここを変更しよう。

バックアップ用のフォルダに出力されるように設定してみました!
Out-File -FilePath "C:\前崎江モール\バックアップ関連ファイル\installed_apps_list.txt"よくある疑問:複数フォルダー指定や「Cドライブ全体」検索はできる?

チノーくん、もしポータブルアプリが複数のフォルダに散らばっている場合や、探すのが面倒だからと「Cドライブ全体(C:\)」を指定して検索するのはダメなんですか?

結論から言うと、「Cドライブ全体(C:\)」を指定するのは絶対におすすめしないよ!
なぜ「パソコン全体(C:\)」の指定がダメなのか?
1.処理が終わらなくなる(フリーズ状態になる)
Windows内には何十万ものファイルが存在するため、全検索すると数十分〜数時間かかってしまう。
2.関係ないシステムファイルが大量に出てくる
C:\Windows や C:\Program Files の奥深くにあるシステム用 .exe がすべて拾われてしまい、ゴミだらけで使えないリストになってしまう。
複数のフォルダーを綺麗に指定する正しい書き方
ポータブルアプリを複数の場所に置いている場合は、@('パス1', 'パス2') という形で配列(リスト)にして指定するのが正解だよ!
$targetFolder = @('C:\Tools', 'D:\PortableApps', "$env:USERPROFILE\Downloads");こうやって指定しておけば、「Tools」「PortableApps」「ダウンロード」の3箇所だけを順番に探してくれるから、動作も軽く、関係ないファイルを拾わずに済むよ。
まとめ

ありがとうございます!無事に自分専用のアプリ一覧テキストが出力できました。これで新PCに買い替えても「あのソフト何だっけ?」とならずに済みそうです。

PCの引っ越し時だけでなく、メモ帳などにコマンドを保存して定期的に実行しておくだけで、万が一のPCトラブル時の復旧リストとしても役立つよ。ぜひ試してみてね!

リストも作ったし、パソコンを初期化しても安心ですね。
……と思ったら、リストごと、アプリとデータ全部消えちゃいました……。

心機一転出来て良かったですね。(呆れ)
リストはあくまでパソコンの中にありますからね!初期化の際は、データとリストはUSBメモリやクラウドストレージなどの別媒体に保存しておきましょうね。


コメント