问题

在批处理文件的一部分(种类,请参阅附加信息)中,我需要重新启动
资源管理器,因此我使用了经过实践检验的方法

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

然后发生这种情况
  • explorer.exe已成功终止
  • explorer.exe已启动(参见图2),但仅
    将打开“资源管理器”窗口,我将无限期地看到它(请参见图1)

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

    额外信息

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

    到目前为止,我已经推断出
  • explorer.exe肯定已被完全杀死。
  • 批处理文件在运行时肯定会正确调用并执行
    脚本中的其他所有内容均按设计工作,除了
    开始explorer.exe
  • 重新启动资源管理器的命令不是“严重时机”或其他任何事情
    试图推迟。
  • 从存档中手动提取时,批处理文件可以完美运行,因此
    压缩或提取过程没有问题。
  • 即使使用start explorer.exe | cmd.exe Explorer之类的命令也不会
    正确重新启动,因此.bat文件绝对不是问题。

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

    状态

    目前,我对WinRAR表示怀疑,因为我已经证明了代码本身
    作品。因此,我正在使用不同版本的SFX创建自执行的SFX
    WinRAR。到目前为止,我已经尝试了以下版本:
  • 4.11 x86
  • 4.11 x64
  • 4.20b3 x86
  • 4.20b3 x64

  • 并且每次都有相同的结果。

    我昨天向[email protected]提交了错误报告,得到了回复
    尤金·罗沙尔(Eugene Roshal)本人今天早晨



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



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



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



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

    证明/证据

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



    您可能会在这里注意到,我在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/

    10-13 08:30