目次
はじめに
PowerShell で Start-Process -Wait を使って Explorer の終了を待ちたい…
でも待てない、固まる、すぐ戻る——そんな経験はありませんか?
この記事では「PowerShell の Start-Process で Explorer の終了待ちができない問題」について、なぜ -Wait が効かないのか、どうすれば終了検知できるのかを詳しく解説します。
PowerShell で自動化スクリプトを書くとき、
「Start-Process explorer.exe を開かせて、ウィンドウが閉じたら次に進みたい」
というニーズはよくあります。
しかし、実際に:
と書いても、Explorer では -Wait が機能しません。
Stack Overflow などでも同じ質問が多数ありますが、根本原因を理解しない限り解決しません。
本記事では、
-
なぜ PowerShell の Start-Process -Wait は Explorer で待てないのか
-
プロセス監視が絶対にうまくいかない理由
-
最終的に「確実に待つ」ための仕組みと考え方
を、実際の検証と試行錯誤をもとに解説します。
コードは書かず、仕組みを理解することにフォーカスした記事です。
PowerShell の Start-Process -Wait が Explorer に効かない理由
結論から言うと:
Explorer は「プロセス」ではなく「シェル」で動いているから
です。
PowerShell の -Wait は
「起動した プロセス が終了するまで待つ」 という動作ですが、
Explorer は普通のアプリではなく Windows の Shell を兼ねています。
そのため、以下の特徴があり -Wait が完全に無力になります。
1. Explorer は“単一プロセス・多ウィンドウ”構造
Windows 10/11 の Explorer は
-
新しいウィンドウを開いても 新規プロセスが起動しない
-
既存の explorer.exe が再利用される
ことが多いです。
つまり:
PowerShell が待ちようがないのです。
2. Explorer ウィンドウを閉じても、プロセスは残留する
Explorer には
-
デスクトップ
-
タスクバー
-
Start メニュー
-
Shell の内部動作
など「シェルとしての役割」があり、
ウィンドウを閉じても explorer.exe は終了しません。
つまり:
3. 同じ explorer.exe の中で “フォルダを移動” しても検知できない
ユーザーが C:\Temp を開いた後に、
そのまま D:\ やデスクトップに移動しても、
-
それでも同じ explorer.exe プロセスが動き続ける
-
プロセス監視では「作業が終わった」かどうか判断できない
よくある誤解
-
Start-Process -Wait は Explorer でも使える → ❌
-
VB.NET なら確実に待てる → ❌ 条件次第で“たまたま”
-
プロセスが終わればウィンドウも閉じたはず → ❌
結論:
Start-Process -Wait で Explorer の終了待ちは ほぼ無理・信用できない
これは仕様なので、どれだけ頑張っても無理です。
ではどうすればいい? → プロセスではなく「フォルダパス」を監視する
いろいろ実験した結果、
Explorer が “どのフォルダを表示しているか” を監視する のが最も安定しました。
理由は明確です:
✅ Explorer のウィンドウは
「現在表示しているフォルダの実体パス」 を持っている。
✅ シェル経由で列挙すれば、プロセスに依存せず
開いているウィンドウ全てのパスを取得できる。
✅ つまり…
● “指定したフォルダが Explorer 上に表示されているか”
● “誰もそのフォルダを表示していない状態になったか”
を確実に検出できる。
実際に必要なのは「2段階の待機」
この記事ではコードは載せませんが、仕組みを説明します。
Step1:Explorer が「そのフォルダを開くまで」を待つ
Explorer は起動直後はまだ表示パスが安定していないため、
-
ウィンドウが生成され
-
そのウィンドウが指定フォルダを表示するまで
を数百 ms〜数秒かけて監視する必要があります。
これが 出現待ち。
Step2:そのフォルダを表示しているウィンドウが「ゼロになるまで」待つ
ユーザーがそのフォルダを開いて作業している間は
-
1つでも Explorer がそのフォルダを表示していれば「まだ作業中」
-
全て閉じる or 別フォルダに移動したら「作業終了」
という判断ができます。
2つ目の Explorer を開いた場合は?
両方が閉じる or 移動するまで“作業中扱い”です。
これは非常に実務的で、
「同じフォルダを複数開いている可能性」を自然に吸収できる
という大きな利点があります。
補足:Windows 11 の Explorer(タブ環境)でも基本は同じ
Windows 11 の Explorer はタブ式ですが、
-
“アクティブタブのパス” が監視対象
-
背景タブは対象外(=多くの業務では問題なし)
という仕様で、
通常の「作業が終わったかどうか」の判定には十分です。
まとめ:Explorer はプロセスではなく“パス”を見るのが正解
PowerShell の Start-Process -Wait が Explorer に効かない理由は、
Explorer がアプリではなく “Windows シェル” だから。
✅ プロセス監視は失敗する
✅ ウィンドウ監視も完全ではない
✅ 表示している「フォルダのパス」を監視すれば確実に動く
という結論にたどり着きました。
自動化で Explorer を組み込む場合は、
-
“フォルダが表示されるまで”
-
“誰もそのフォルダを見ていない状態になるまで”
という パスベースの待機 を使うのが最も現実的で安定します。
実務用途でも十分使えるアプローチなので、
同じ課題で困っている方の参考になれば幸いです。
参考リンク
Powershell start-process running windows explorer does not wait