重新启动explorer.exe只会打开一个资源管理器窗口。

24

问题

在批处理的某个部分(有点像,见额外信息)中,我需要重新启动资源管理器,所以我使用了一种经过验证的方法:

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

然后发生了这个

  1. explorer.exe 被成功终止
  2. explorer.exe 启动(见Image 2),但只打开一个资源管理器窗口,该窗口一直保持打开状态(见Image 1)

此时我只能通过从任务管理器启动新任务来正确重启资源管理器,因为我认为 Win + R 是资源管理器的一部分。

额外信息

现在,我说“有点”是因为我正在从一个自解压SFX存档中运行批处理文件,该存档是使用WinRAR创建的。因此,在执行时,存档的内容被提取到 %temp% ,并且会在成功提取后运行用户定义的文件(通常是一个启动程序,在本例中是我的批处理文件)。

到目前为止,我已经得出以下结论:

  1. explorer.exe 肯定被完全终止。
  2. 批处理文件肯定被正确调用和执行,因为它运行并且脚本中的其他所有内容都按设计工作,除了启动 explorer.exe 的那一行。
  3. 重新启动资源管理器的命令没有“时机不对”之类的问题,因为我已经尝试过延迟。
  4. 当从存档中手动提取批处理文件时,该批处理文件完美无缺,因此它不是与压缩或提取过程有关的问题。
  5. 即使使用像 start explorer.exe | cmd.exe 这样的命令,资源管理器也不能正确重启,因此这绝对不是与 .bat 文件有关的问题。

我可以确认它在Windows XP和Windows 7 x86上运行正常,但在Windows 7 x64上(我的系统)不正常。

状态

目前,我怀疑WinRAR,因为我已经证明了代码本身是有效的。因此,我使用不同版本的WinRAR创建自解压SFX。到目前为止,我尝试了以下版本:

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

每次都得到相同的结果。

我昨天向dev@rarlab.com提交了一个错误报告,今天早上收到了Eugene Roshal本人的回复

  

你好,   SFX 模块使用 ShellExecuteEx 启动设置应用程序。   通常它工作得很好。我不知道资源管理器为什么要切换到窗口模式。   现在我建立了一个小的独立程序

#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完全一致,因此启动了一个窗口中的资源管理器。

今天早上收到了第二封电子邮件:

抱歉,现在没有建议。我用CreateProcess替换了ShellExecuteEx。

#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_标志,如SW_SHOWDEFAULT或SW_RESTORE,并将ShellExecuteEx中的lpVerb设置为“open”和“explore”,但这并没有帮助。目前我不理解窗口模式与桌面模式背后的逻辑。
我意识到前景不妙,但我希望对某人有所帮助。 证明/证据 如果有人需要,可以链接到演示此内容的SFX归档文件: https://dl.dropbox.com/u/27573003/Social%20Distribution/restart-explorer.exe image 1 image 2 您可能会注意到,在此处运行命令时,我正在虚拟机内部运行(如VMwareTray.exe所示),但这并不是由于虚拟机引起的冲突。我已在自己的主机系统上测试了完全相同的文件(该系统与操作系统相同),并获得了相同的结果。 更新 当在完全不同的项目中使用REG ADD时,我遇到了类似的“在SFX归档文件之外可以正常工作,但在其中不能正常工作”的问题。我只是认为SFX归档文件不会与批处理文件协作。

适用于XP 32位。也许你的exe没有“杀死”的许可证?UAC和Internet区域安全设置可能是罪魁祸首。 - panda-34
但它确实会终止该进程。只是无法正确地重新启动它。而且没有 UAC 弹出窗口,以管理员身份运行也没有任何区别。 - mythofechelon
等一下,如果它正在杀死进程,并且之后又打开了一个资源管理器窗口,那么它不是重新启动资源管理器吗?据我所知,没有运行资源管理器时是无法打开资源管理器窗口的。 - JAB
1
我想知道Win-RAR的某些部分是否以32位模式运行?你能否从32位进程中启动explorer64?我非常确定Windows不会这样做。 - user1631170
15个回答

16
我认为user1631170说的有道理,“我想知道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)。


2
这个很好用。谢谢提供信息。(顺便说一句:我在Windows 7上使用了它) - JasonBub
在Windows 10上运行良好。 - aybe

10
我曾经遇到过同样的问题,并发现这里提供的所有解决方案在批处理脚本中仍然无法完全解决问题。
以下解决方案均不完全有效:
start explorer.exe
start explorer
explorer.exe
explorer

因为他们要么打开了窗口(并且没有再次显示任务栏),要么批处理脚本之后就挂起了,无法执行任何更多的命令。
我发现在杀掉explorer.exe之后,批处理文件中的这行代码确实可以正常工作:
start "" "%windir%\explorer.exe"

并且允许在脚本中执行它之后的其他命令。


这实际上为我打开了一个新的命令提示符,但仍然没有加载桌面。 - ndw
对我来说有效,谢谢! - Himesh Aadeshara

7

这在Windows 7中有效:

taskkill /f /IM explorer.exe
start explorer.exe
exit

2
只有在32位系统的32位进程中或64位系统的64位进程中才能正常工作,如果在64位系统的32位进程中则会失败。 - nerdfever.com

3

对于重新启动 explorer.exe,这个方法适用于我。

powershell.exe Stop-Process -processname explorer

2
当你在64位Windows中从32位应用程序运行explorer.exe时,路径将被重定向到包含32位explorer.exe的SysWOW64目录。
在XP64中,这不是什么大问题。在任务管理器中,你可以看到正在运行的32位explorer.exe,但它启动为shell。在Windows 10中(当我遇到这个问题时,看起来是在Windows 7中引入的),32位explorer.exe是一个存根,它创建了一个新的64位explorer.exe实例。它可能会在命令行上传递路径,因此64位explorer.exe打开窗口而不是启动shell。
因此,像以前一样,你仍然可以通过使用或不使用路径作为命令行参数来控制是否启动窗口或shell。
相反,你应该强制从32位应用程序启动64位explorer.exe,这样一切都没问题。为此,一种方法是使用上面提到的sysnative目录。但另一种方法是使用Wow64DisableWow64FsRedirection / Wow64RevertWow64FsRedirection。
我选择了后者,并确认它非常好用。适用于CreateProcess和ShellExecuteEx API。

1

尝试

%windir%\explorer.exe
start %windir%\explorer.exe
start /d%windir% explorer.exe

我已经尝试了前两种变体,现在我将尝试最后一种。 - mythofechelon
是的,这似乎并没有产生任何不同。 :/ - mythofechelon

0
前几天,我正在查看WinRAR的一些更高级选项,然后发现了这个选项卡:

enter image description here

一看到这个,我就怀疑它是问题和解决方案的一部分,因为这个问题只在Windows 7 x64上出现。

果然如我所料,使用Default64.SFX模块代替默认的Default.SFX模块完全解决了这个问题。终于解决了。


0

我不明白为什么,但只有使用完整路径,无论您的PATH变量如何,它才能为我正常工作。

%windir%\explorer

0

尝试在注册表中的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
请使用管理员权限运行此 x64 或 x86 的 .bat 文件。
tasklist /fi "imagename eq explorer*" | find /i "explorer*"
if not errorlevel 1 (taskkill /f /im "explorer*") else (
start %windir%\explorer.exe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接