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

myt*_*lon 23 windows explorer batch-file taskkill

问题

在批处理文件的一部分(有点,请参阅额外信息)我需要重新启动资源管理器,所以我使用经过试验和测试的方法

taskkill /f /im explorer.exe >nul
explorer.exe
Run Code Online (Sandbox Code Playgroud)

然后发生这种情况

  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.exeExplorer这样的命令没有正确重启,所以它绝对不是.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来启动安装应用程序.通常它运作良好.我不知道为什么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);
}
Run Code Online (Sandbox Code Playgroud)

它运行test.bat,其中包含样本中的内容.此程序显示与WinRAR SFX完全相同的行为,因此Explorer在窗口中启动.

和今天早上的第二封电子邮件

对不起,现在没有建议.我用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);
}
Run Code Online (Sandbox Code Playgroud)

但结果是一样的.我尝试使用其他SW_标志,如SW_SHOWDEFAULT或SW_RESTORE,ShellExecuteEx也作为"打开"和"探索"lpVerb,但它没有帮助.目前我不明白这种窗口模式与桌面模式背后的逻辑.

我意识到前景是严峻的,但我希望对某人有所帮助..

证据/证据

链接到SFX档案,证明这一点,如果有人想要它:https: //dl.dropbox.com/u/27573003/Social%20Distribution/restart-explorer.exe

图片1

图片2

您可能会注意到我在VM中运行命令(如表示的那样 VMwareTray.exe)但它不是由VM引起的冲突.我已经在我自己的主机系统(这是相同的操作系统)上测试了完全相同的文件,并且得到了相同的结果.

更新

我正在经历类似的"SFX存档之外的工作,但REG ADD在一个完全不同的项目中使用时不会出现问题" .我只是不认为SFX档案与批处理文件很好.

小智 15

我认为user1631170正在发布一些事情,"我想知道Win-RAR的某些部分是否在32位模式下运行?你甚至可以从32位进程启动explorer64吗?我很确定Windows不会这样做".

当我从ProcessHacker(32位进程管理器)启动explorer.exe时,我得到一个资源管理器窗口.

但是我可以用它强制它启动64位资源管理器:

%systemroot%\sysnative\cmd.exe /c start /B explorer.exe
Run Code Online (Sandbox Code Playgroud)

sysnative是Windows认可绕过32位/ 64位文件系统重定向的关键字(http://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85) .aspx 享受!

  • 这很有效.谢谢你的信息.(顺便说一下:我在Windows 7上使用过它) (2认同)

spa*_*owt 8

我遇到了同样的问题,发现这里的所有解决方案仍然无法使用批处理脚本.

这些都没有完全奏效:

start explorer.exe
start explorer
explorer.exe
explorer
Run Code Online (Sandbox Code Playgroud)

因为它们都打开了一个窗口(并且没有再次显示任务栏),或者之后挂起的批处理脚本无法再执行任何命令

我发现批处理文件中的这一行确实有效(杀死explorer.exe后):

start "" "%windir%\explorer.exe"
Run Code Online (Sandbox Code Playgroud)

并且还允许在脚本中执行其他命令


Jac*_*nev 6

这适用于Windows 7:

taskkill /f /IM explorer.exe
start explorer.exe
exit
Run Code Online (Sandbox Code Playgroud)

  • 不,同样的事情发生了. (5认同)
  • 仅当您处于 32 位系统上的 32 位进程中或 64 位系统上的 64 位进程中时才有效。如果您处于 64 位系统上的 32 位进程中,则它会失败。 (2认同)

myt*_*lon 0

有一天,我在查看 WinRAR 的一些更高级选项时发现了这个选项卡:

在此输入图像描述

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

正如所怀疑的,使用该Default64.SFX模块而不是默认Default.SFX模块完全解决了该问题。最后。