23

问题

在批处理文件的一部分(类型,请参阅额外信息)中,我需要重新启动资源管理器,因此我使用了久经考验的方法

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

然后发生这种情况

  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.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 启动设置应用程序。通常它运作良好。我不知道为什么 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 完全相同的行为,因此资源管理器在窗口中启动。

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

对不起,现在没有建议。我用 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 一起用作“open”和“explore”lpVerb,但它没有帮助。现在我不明白这种窗口模式与桌面模式背后的逻辑。

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

证明/证据

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

图 1

图 2

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

更新

REG ADD在完全不同的项目中使用时,我遇到了类似的“在 SFX 存档之外工作但不是来自一个”的问题。我只是不认为 SFX 档案与批处理文件配合得很好。

4

15 回答 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 享受吧!

于 2013-11-17T23:17:58.533 回答
9

我遇到了同样的问题,发现这里的所有解决方案仍然无法从批处理脚本中运行。

这些都没有完全奏效:

start explorer.exe
start explorer
explorer.exe
explorer

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

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

start "" "%windir%\explorer.exe"

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

于 2014-05-27T12:27:14.830 回答
6

这适用于 Windows 7:

taskkill /f /IM explorer.exe
start explorer.exe
exit
于 2012-06-09T14:33:32.053 回答
3

对于重新启动 explorer.exe,这对我有用。

powershell.exe Stop-Process -processname explorer
于 2017-08-10T00:21:28.910 回答
1

尝试

%windir%\explorer.exe
start %windir%\explorer.exe
start /d%windir% explorer.exe
于 2012-06-08T19:17:35.947 回答
1

当您在 64 位窗口中从 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。

所以它仍然像以前一样,您可以通过使用或不使用路径作为命令行参数启动 explorer.exe 来控制是否应该启动窗口或 shell。

相反,您应该强制从 32 位应用程序启动 64 位 explorer.exe,一切正常。为此,一种方法是使用上面提到的 sysnative 目录。但另一种方法是使用 Wow64DisableWow64FsRedirection/Wow64RevertWow64FsRedirection。

我做了后者,并且可以确认它运行良好。对于 CreateProcess 和 ShellExecuteEx API。

于 2018-08-18T01:08:32.720 回答
0

在 C# 中执行此操作之前,我已经看到了类似的问题。该过程必须通过调用资源管理器外壳而不是资源管理器窗口来调用,但我批量没有任何问题。

尝试使用这个:

taskkill /im explorer.exe /f
explorer

其他答案之间的区别是,explorer而不是explorer.exe哪个给我带来了问题。

这适用于我的 Win7 x64 PC。

希望这可以帮助!

于 2012-06-11T09:29:43.933 回答
0

前几天,我浏览了 WinRAR 的一些更高级的选项,发现了这个选项卡:

在此处输入图像描述

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

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

于 2013-02-25T22:27:07.893 回答
0

我不明白为什么,但只有在使用完整路径时才会对我有用,而不管您的PATH变量如何。

%windir%\explorer
于 2013-07-05T04:13:39.637 回答
0

Visual Studio 也有同样的问题。

什么对我有用(Win 7 Pro 64bit):

项目名称上的 PPM 选择“属性”

配置属性 > 构建事件 > 预构建事件

taskkill /im explorer.exe /f

配置属性 > 构建事件 > 构建后事件

start "" "C:\Windows\explorer.exe"

但这会产生其他问题(资源管理器运行后 IDE 被冻结),现在我只能重新启动 IDE 以再次运行构建命令......

于 2015-07-02T12:09:14.130 回答
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
于 2016-07-25T17:34:37.130 回答
0

在 Windows 7 64 位中对我有用的是“C:\Windows\expstart.exe”或只是 expstart.exe

于 2016-11-22T17:44:36.860 回答
0

尝试将 explorer.exe 键添加到注册表中的 App Paths。

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"

于 2017-04-18T12:17:06.320 回答
0

要查看开始面板,您需要从system32文件夹执行 explorer.exe

taskkill /im explorer.exe /f

cd %WINDIR%\system32
start %WINDIR%\explorer.exe
于 2020-06-06T18:49:10.953 回答
-5

简单的上下文菜单

只需右键单击桌面并选择Restart Windows Explorer。享受!

配置截图

于 2014-02-26T16:01:08.637 回答