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

标签 windows batch-file explorer taskkill

问题

在批处理文件的一部分(有点,参见额外信息)我需要重新启动 Explorer,所以我用的是,久经考验的方法

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

然后会发生这种情况

  1. explorer.exe 成功终止
  2. explorer.exe 已启动(参见图 2),但只有一个 Explorer 窗口打开,我会无限期地离开它(见图 1)

然后我只能通过从 Task 启动一个新任务来正确地重新启动 Explorer 经理,我假设 Win + R 是 Explorer 的一部分。

额外信息

现在,当我从自执行的 SFX 运行批处理文件时,我说“有点” 存档,使用 WinRAR 创建。因此,执行时,存档的内容是 提取到 %temp% 和一个用户定义的文件(通常是 Bootstrap ,在 在这种情况下,我的批处理文件)在成功提取后运行。

到目前为止,我已经推断

  1. explorer.exe 肯定被完全杀死了。
  2. 批处理文件在运行和运行时肯定会被正确调用和执行 脚本中的其他所有内容都按设计工作,除了 启动 explorer.exe
  3. 重新启动 Explorer 的命令并不像我所说的那样“时机不对”或其他任何东西 试着推迟它。
  4. 从存档中手动提取批处理文件时效果很好,所以 这不是压缩或提取过程的问题。
  5. 即使使用start explorer.exe | 这样的命令cmd.exe Explorer 没有 正常重启,肯定不是.bat文件的问题。

我可以确认它适用于 Windows XP 和 Windows 7 x86 但不适用于 Windows 7 x64(这是我的系统)。

状态

目前,我对 WinRAR 持怀疑态度,因为我已经证明代码本身 作品。所以,我正在用不同版本的 WinRAR。到目前为止,我已经尝试过以下版本:

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

每次都有相同的结果。

我昨天向 dev@rarlab.com 提交了错误报告,得到了回复 尤金·罗沙尔本人今天早上

Hello, SFX module uses ShellExecuteEx to start a setup application. Normally it works well. I do not know why Explorer decides to switch to windowed mode. Now I built a small standalone program

#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);
}

which runs test.bat with contents as in your sample. This program shows exactly the same behavior as WinRAR SFX, so Explorer is started in window.

还有今天早上的第二封邮件

Sorry, no advice now. I replaced ShellExecuteEx with 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);
}

but result is the same. I tried to use other SW_ flags like SW_SHOWDEFAULT or SW_RESTORE with ShellExecuteEx also as "open" and "explore" lpVerb, but it does not help. For now I do not understand the logic behind this windowed versus desktop mode.

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

证据/证据

链接到演示此内容的 SFX 存档,如果有人需要的话: https://dl.dropbox.com/u/27573003/Social%20Distribution/restart-explorer.exe

image 1

image 2

您可能会在这里注意到我在 VM 中运行命令(如 VMwareTray.exe) 但它不是 VM 引起的冲突。我测试过完全一样 我自己的主机系统(这是相同的操作系统)上的文件并且具有相同的 结果。

更新

我遇到了类似的“在 SFX 文件之外但不是来自一个”的情况 在完全不同的项目中使用 REG ADD 时出现问题。 我只是认为 SFX 文件不能很好地处理批处理文件。

最佳答案

我认为 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 享受吧!

关于windows - 重新启动 explorer.exe 只会打开一个资源管理器窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10954041/

相关文章:

windows - virtualbox ose windows 二进制文件

windows - 用于演示目的的 'read-only' 、 'non-removable' 应用程序安装日期的存储位置

无法通过套接字 C 发送文件

batch-file - 使用批处理文件我需要知道特定位置的最新文件夹名称

c++ - 更改资源管理器数据提供者的类别

windows - 更改 solaris 网络超时

python - 在 Windows 下如何共享日志文件?

windows - 用于删除早于 X 天的文件的批处理脚本(基于创建日期,而不是修改日期)

visual-studio - Visual Studio 和/或 Windows 资源管理器因 TypeScript 文件而崩溃

c# - 如何在 Windows 资源管理器中打开文件夹?