問題
バッチファイルの一部(種類、追加情報を参照)でエクスプローラーを再起動する必要があるため、試してテストされた方法を使用します
taskkill /f /im Explorer.exe >nul
Explorer.exe
その後、これが起こります
Explorer.exe
は正常に終了しましたExplorer.exe
が起動しますが(画像2を参照)、エクスプローラーウィンドウのみが開き、いつまでも表示されません(画像1を参照)Win + R
はエクスプローラーの一部であるため、タスクマネージャーから新しいタスクを開始することによってのみ、エクスプローラーを適切に再起動できます。
追加情報
ここで、WinRARで作成された自己実行型SFXアーカイブからバッチファイルを実行しているので、「種類」と言います。したがって、実行すると、アーカイブの内容が%temp%
に抽出され、抽出が成功すると、ユーザー定義ファイル(通常はブートストラップとこの場合はバッチファイル)が実行されます。
これまでのところ、私は推論しました
Explorer.exe
は確実に完全に殺害されています。Explorer.exe
で始まる行を除いて、スクリプトの他のすべてが設計どおりに機能するためです。start Explorer.exe | cmd.exe
のようなコマンドを使用しても、Explorerは適切に再起動しないため、.bat
ファイルに問題がないことは間違いありません。私はそれがWindows XPおよびWindows 7 x86では動作するが、Windows 7 x64(私のシステム)では動作しない)で動作することを確認できます。
ステータス
現時点では、コード自体が機能することを証明したので、WinRARには疑いがあります。そこで、WinRARの異なるバージョンで自己実行型SFXを作成しています。これまでのところ、私はバージョンを試しました:
毎回同じ結果が出ました。
昨日、バグレポートを[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
ここで、VM(VMwareTray.exe
で示される)内でコマンドを実行しているが、VMが原因の競合ではないことに気付くかもしれません。私のホストシステム(同じOS)上のファイルと同じ結果が得られました。
更新
まったく別のプロジェクトでREG ADD
を使用すると、「SFXアーカイブの外部では機能するが、SFXアーカイブでは機能しない」という同様の問題が発生します。私はSFXアーカイブがバッチファイルでニースを再生するとは思いません。
先日、WinRARのより高度なオプションのいくつかを調べていたところ、このタブが見つかりました。
この問題はWindows 7 x64でのみ発生するため、私はそれを問題と解決策の一部であると思ったのを見てすぐになりました。
疑われるように、デフォルトのDefault64.SFX
モジュールの代わりにDefault.SFX
モジュールを使用すると、問題が完全に修正されました。最後に。
「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 お楽しみください!
私はこれと同じ問題を抱えていましたが、ここでのすべての解決策はまだバッチスクリプトでは機能しませんでした。
これらのどれも完全に機能しませんでした:
start Explorer.exe
start Explorer
explorer.exe
Explorer
それらはすべてウィンドウを開いた(そしてタスクバーを再び表示しなかった)か、その後バッチスクリプトがハングしてそれ以上コマンドを実行できなかったためです。
バッチファイルの次の行が機能したことがわかりました(Explorer.exeを強制終了した後)。
start "" "%windir%\Explorer.exe"
また、スクリプトの後に他のコマンドを実行できるようにしました
これはWindows 7で機能します。
taskkill /f /IM Explorer.exe
start Explorer.exe
exit
Explorer.exeを再起動する場合、これは私にとってはうまくいきました。
powershell.exe Stop-Process -processname Explorer
試す
%windir%\Explorer.exe
start %windir%\Explorer.exe
start /d%windir% Explorer.exe
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の両方。
X64またはx86でこれ(管理者権限を持つ.bat)を使用します
tasklist /fi "imagename eq Explorer*" | find /i "Explorer*"
if not errorlevel 1 (taskkill /f /im "Explorer*") else (
start %windir%\Explorer.exe
レジストリの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"
Windows 7 64ビットで私のために働いたのは「C:\ Windows\expstart.exe」または単にexpstart.exeでした
Visual Studioでも同じ問題が発生します。
私のために働くもの(Win 7 Pro 64bit):
プロジェクト名のPPMで[プロパティ]を選択します
構成プロパティ>ビルドイベント>ビルド前イベント
taskkill /im Explorer.exe /f
構成プロパティ>ビルドイベント>ビルド後のイベント
start "" "C:\Windows\Explorer.exe"
しかし、これにより他の問題が発生し(IDEがExplorerの実行後にフリーズします)、現在IDEを再起動してビルドコマンドを再度実行することしかできません。 ..
C#でこれを行う前に、同様の問題が発生しました。このプロセスは、エクスプローラウィンドウではなくエクスプローラシェルを呼び出すことによって呼び出す必要がありましたが、バッチで問題が発生したことはありません。
これを使ってみてください:
taskkill /im Explorer.exe /f
Explorer
他の回答の違いはExplorer.exe
ではなくExplorer
であり、これは以前に問題を引き起こしていました。
これは私のWin7 x64 PCで動作します。
お役に立てれば!