web-dev-qa-db-ja.com

Explorer.exeを再起動すると、エクスプローラウィンドウのみが開きます

問題

バッチファイルの一部(種類、追加情報を参照)でエクスプローラーを再起動する必要があるため、試してテストされた方法を使用します

taskkill /f /im Explorer.exe >nul
Explorer.exe

その後、これが起こります

  1. Explorer.exeは正常に終了しました
  2. Explorer.exeが起動しますが(画像2を参照)、エクスプローラーウィンドウのみが開き、いつまでも表示されません(画像1を参照)

Win + Rはエクスプローラーの一部であるため、タスクマネージャーから新しいタスクを開始することによってのみ、エクスプローラーを適切に再起動できます。

追加情報

ここで、WinRARで作成された自己実行型SFXアーカイブからバッチファイルを実行しているので、「種類」と言います。したがって、実行すると、アーカイブの内容が%temp%に抽出され、抽出が成功すると、ユーザー定義ファイル(通常はブートストラップとこの場合はバッチファイル)が実行されます。

これまでのところ、私は推論しました

  1. Explorer.exeは確実に完全に殺害されています。
  2. バッチファイルは確実に呼び出され、正しく実行されます。スクリプトが実行され、Explorer.exeで始まる行を除いて、スクリプトの他のすべてが設計どおりに機能するためです。
  3. エクスプローラーを再起動するコマンドは、「タイミングが悪い」などの理由で、遅延させようとしました。
  4. バッチファイルは、アーカイブから手動で抽出したときに完全に機能するため、圧縮または抽出プロセスの問題はありません。
  5. start Explorer.exe | cmd.exeのようなコマンドを使用しても、Explorerは適切に再起動しないため、.batファイルに問題がないことは間違いありません。

私はそれがWindows XPおよびWindows 7 x86では動作するが、Windows 7 x64(私のシステム)では動作しない)で動作することを確認できます。

ステータス

現時点では、コード自体が機能することを証明したので、WinRARには疑いがあります。そこで、WinRARの異なるバージョンで自己実行型SFXを作成しています。これまでのところ、私はバージョンを試しました:

  • 4.11 x86
  • 4.11 x64
  • 4.20b3 x86
  • 4.20b3 x64

毎回同じ結果が出ました。

昨日、バグレポートを[email protected]に送信し、今朝Eugene Roshalから返信をもらいました

こんにちは、SFXモジュールはShellExecuteExを使用してセットアップアプリケーションを起動します。通常は問題なく動作します。 Explorerがウィンドウモードに切り替えることにした理由がわかりません。今私は小さなスタンドアロンプ​​ログラムを構築しました

#include <windows.h>    
void main()
{
  SHELLEXECUTEINFO si;
  memset(&si,0,sizeof(si));
  si.cbSize=sizeof(si);
  si.lpFile="test.bat";
  si.nShow=SW_SHOWNORMAL;
  ShellExecuteEx(&si);
}

サンプルと同じ内容でtest.batを実行します。このプログラムはWinRAR SFXとまったく同じ動作をするため、エクスプローラーはウィンドウで起動されます。

そして今朝の2回目のメール

現在、アドバイスはありません。 ShellExecuteExをCreateProcessに置き換えました

#include <windows.h>
void main()
{
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  memset(&si,0,sizeof(si));
  si.cb=sizeof(si);
  CreateProcess(NULL,"test.bat",NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
}

結果は同じです。 SW_SHOWDEFAULTやSW_RESTOREのような他のSW_フラグをShellExecuteExでlpVerbを「オープン」および「探索」として使用しようとしましたが、役に立ちません。今のところ、私はこのウィンドウモードとデスクトップモードの背後にあるロジックを理解していません。

見通しは厳しいと思いますが、それが誰かの役に立てば幸いです。

証明/証拠

これを示すSFXアーカイブへのリンク(必要な場合) https://dl.dropbox.com/u/27573003/Social%20Distribution/restart-Explorer.exe

image 1

image 2

ここで、VM(VMwareTray.exeで示される)内でコマンドを実行しているが、VMが原因の競合ではないことに気付くかもしれません。私のホストシステム(同じOS)上のファイルと同じ結果が得られました。

更新

まったく別のプロジェクトでREG ADDを使用すると、「SFXアーカイブの外部では機能するが、SFXアーカイブでは機能しない」という同様の問題が発生します。私はSFXアーカイブがバッチファイルでニースを再生するとは思いません。

23
mythofechelon

先日、WinRARのより高度なオプションのいくつかを調べていたところ、このタブが見つかりました。

enter image description here

この問題はWindows 7 x64でのみ発生するため、私はそれを問題と解決策の一部であると思ったのを見てすぐになりました。

疑われるように、デフォルトのDefault64.SFXモジュールの代わりにDefault.SFXモジュールを使用すると、問題が完全に修正されました。最後に。

0
mythofechelon

「Win-RARの一部が32ビットモードで実行されているのでしょうか。32ビットプロセスからExplorer64を起動することもできますか?Windowsがそれを実行しないことは間違いありません。 」

ProcessHacker(32ビットプロセスマネージャー)からExplorer.exeを起動すると、エクスプローラーウィンドウが表示されます。

しかし、これで64ビットエクスプローラーを強制的に起動できます。

%systemroot%\sysnative\cmd.exe /c start /B Explorer.exe

sysnativeは、Windowsが32ビット/ 64ビットのファイルシステムリダイレクトをバイパスすることを認識するキーワードです( http://msdn.Microsoft.com/en-us/library/windows/desktop/aa384187(v = vs.85).aspx お楽しみください!

15
Doug Benham

私はこれと同じ問題を抱えていましたが、ここでのすべての解決策はまだバッチスクリプトでは機能しませんでした。

これらのどれも完全に機能しませんでした:

start Explorer.exe
start Explorer
explorer.exe
Explorer

それらはすべてウィンドウを開いた(そしてタスクバーを再び表示しなかった)か、その後バッチスクリプトがハングしてそれ以上コマンドを実行できなかったためです。

バッチファイルの次の行が機能したことがわかりました(Explorer.exeを強制終了した後)。

start "" "%windir%\Explorer.exe"

また、スクリプトの後に他のコマンドを実行できるようにしました

8
sparrowt

これはWindows 7で機能します。

taskkill /f /IM Explorer.exe
start Explorer.exe
exit
6
Jacob Seleznev

Explorer.exeを再起動する場合、これは私にとってはうまくいきました。

powershell.exe Stop-Process -processname Explorer
2
Matt

試す

%windir%\Explorer.exe
start %windir%\Explorer.exe
start /d%windir% Explorer.exe
1
panda-34

64ビットウィンドウで32ビットアプリケーションからExplorer.exeを実行すると、32ビットのExplorer.exeを含むSysWOW64ディレクトリにパスがリダイレクトされます。

XP64では、それほど大したことではありませんでした。タスクマネージャーで、32ビットのExplorer.exeが実行されているのを確認できますが、シェルとして起動しました。 Windows 10(この問題については、Windows 7で導入されたようです)では、32ビットのExplorer.exeは、64ビットのExplorer.exeの新しいインスタンスを作成するスタブです。おそらくここでコマンドラインのパスを渡すため、64ビットのExplorer.exeはシェルを起動する代わりにウィンドウを開きます。

したがって、コマンドラインパラメータとしてパスを指定して、または指定せずにExplorer.exeを起動して、ウィンドウまたはシェルを開始するかどうかを制御できるのは、以前と同じです。

代わりに、32ビットアプリケーションから64ビットのExplorer.exeを強制的に起動する必要がありますが、問題はありません。これを行うには、前述のようにsysnativeディレクトリを使用する方法があります。ただし、別の方法は、Wow64DisableWow64FsRedirection/Wow64RevertWow64FsRedirectionを使用することです。

私は後者を行い、それがうまく機能することを確認できます。 CreateProcess APIとShellExecuteEx APIの両方。

1
Arnoud Mulder

X64またはx86でこれ(管理者権限を持つ.bat)を使用します

tasklist /fi "imagename eq Explorer*" | find /i "Explorer*"
if not errorlevel 1 (taskkill /f /im "Explorer*") else (
start %windir%\Explorer.exe
0
user4839775

レジストリのApp PathsにExplorer.exeキーを追加してみてください。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Explorer.exe

(デフォルト)C:\ Windows\Explorer.exe

パスC:\ Windows

または、以下をメモ帳にコピーして.regファイルとして保存し、実行します。


Windowsレジストリエディターバージョン5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Explorer.exe] @ = "C:\ Windows\Explorer.exe" "Path" = "C:\ Windows"

0
kenner116

Windows 7 64ビットで私のために働いたのは「C:\ Windows\expstart.exe」または単にexpstart.exeでした

0
Mike Hadden

Visual Studioでも同じ問題が発生します。

私のために働くもの(Win 7 Pro 64bit):

プロジェクト名のPPMで[プロパティ]を選択します

構成プロパティ>ビルドイベント>ビルド前イベント

taskkill /im Explorer.exe /f

構成プロパティ>ビルドイベント>ビルド後のイベント

start "" "C:\Windows\Explorer.exe"

しかし、これにより他の問題が発生し(IDEがExplorerの実行後にフリーズします)、現在IDEを再起動してビルドコマンドを再度実行することしかできません。 ..

0
Paweł Liszka

C#でこれを行う前に、同様の問題が発生しました。このプロセスは、エクスプローラウィンドウではなくエクスプローラシェルを呼び出すことによって呼び出す必要がありましたが、バッチで問題が発生したことはありません。

これを使ってみてください:

taskkill /im Explorer.exe /f
Explorer

他の回答の違いはExplorer.exeではなくExplorerであり、これは以前に問題を引き起こしていました。

これは私のWin7 x64 PCで動作します。

お役に立てれば!

0
Bali C