パソコン関連の書籍等を読んで試したりしながらアウトプットしまくります。

アウトプットしながら学ぶ

トラブル対応

PowerShell Start-Process 終了 待ち|Explorer を待てない理由と解決策

投稿日:

はじめに

PowerShell で Start-Process -Wait を使って Explorer の終了を待ちたい…
でも待てない、固まる、すぐ戻る——そんな経験はありませんか?

この記事では「PowerShell の Start-Process で Explorer の終了待ちができない問題」について、なぜ -Wait が効かないのか、どうすれば終了検知できるのかを詳しく解説します。

PowerShell で自動化スクリプトを書くとき、
「Start-Process explorer.exe を開かせて、ウィンドウが閉じたら次に進みたい」
というニーズはよくあります。

しかし、実際に:

Start-Process explorer.exe "C:\Target" -Wait

と書いても、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 は終了しません。

つまり:

ウィンドウ閉じてもプロセスは続く → -Wait が永遠に戻らない

 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







-トラブル対応
-, , , , , , , , , , , , , , ,

Copyright© アウトプットしながら学ぶ , 2025 AllRights Reserved Powered by AFFINGER4.