问题
在批处理文件的一部分(有点,参见额外信息)我需要重新启动 Explorer,所以我用的是,久经考验的方法
taskkill /f /im explorer.exe >nul
explorer.exe
然后会发生这种情况
explorer.exe
成功终止explorer.exe
已启动(参见图 2),但只有一个 Explorer 窗口打开,我会无限期地离开它(见图 1)
然后我只能通过从 Task 启动一个新任务来正确地重新启动 Explorer
经理,我假设 Win + R
是 Explorer 的一部分。
额外信息
现在,当我从自执行的 SFX 运行批处理文件时,我说“有点”
存档,使用 WinRAR 创建。因此,执行时,存档的内容是
提取到 %temp%
和一个用户定义的文件(通常是 Bootstrap ,在
在这种情况下,我的批处理文件)在成功提取后运行。
到目前为止,我已经推断
explorer.exe
肯定被完全杀死了。- 批处理文件在运行和运行时肯定会被正确调用和执行
脚本中的其他所有内容都按设计工作,除了
启动
explorer.exe
- 重新启动 Explorer 的命令并不像我所说的那样“时机不对”或其他任何东西 试着推迟它。
- 从存档中手动提取批处理文件时效果很好,所以 这不是压缩或提取过程的问题。
- 即使使用
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
您可能会在这里注意到我在 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/