问题
在一个batch file的一部分(types,请参阅额外信息)我需要重新启动资源pipe理器,所以我使用,试用和testing的方法
taskkill /f /im explorer.exe >nul explorer.exe
然后这发生
explorer.exe
被成功终止 explorer.exe
启动(见图2),但只有一个资源pipe理器窗口打开,我无限期留下(见图1) 然后,我只能通过从任务pipe理器启动一个新的任务,正确地重新启动资源pipe理器,因为我假设Win + R
是资源pipe理器的一部分。
额外的信息
现在,我说“kind of”,因为我正在使用WinRAR创build的自执行的SFX压缩文件运行batch file。 因此,执行时,归档的内容被提取到%temp%
并且在成功提取时运行用户定义的文件(通常是boot-strapper,在这个例子中是我的batch file)。
到目前为止,我已经推断出
explorer.exe
肯定正在被完全杀死。 explorer.exe
的行 start explorer.exe | cmd.exe
命令 start explorer.exe | cmd.exe
资源pipe理器无法正常重启,所以它绝对不是.bat
文件的问题。 我可以确认它可以在Windows XP和Windows 7 x86上运行,但不能在Windows 7 x64上运行(这是我的系统)。
状态
此刻,我怀疑WinRAR,因为我已经certificate代码本身的作品。 所以,我正在用不同版本的WinRAR创build自执行的SFX。 到目前为止,我已经尝试过版本:
每次都有相同的结果。
我昨天向dev@rarlab.com提交了一个错误报告,今天上午得到了Eugene Roshal本人的回复
你好,SFX模块使用ShellExecuteEx来启动一个安装程序。 通常它运作良好。 我不知道为什么浏览器决定切换到窗口模式。 现在我build立了一个小型的独立程序
#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完全相同的行为,因此Explorer在窗口中启动。
还有今天早上的第二封电子邮件
对不起,现在没有build议。 我用CreateProcessreplace了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也作为“打开”和“探索”lpVerb,但它没有帮助。 现在我不明白这个窗口与桌面模式背后的逻辑。
我意识到前景是严峻的,但我希望对某人有所帮助。
证据/证据
链接到SFX存档展示这个,如果有人想要它: https : //dl.dropbox.com/u/27573003/Social%20Distribution/restart-explorer.exe
您可能会注意到,我正在虚拟机中运行命令(如VMwareTray.exe
),但这不是虚拟机引起的冲突。 我testing了我自己的主机系统(这是相同的操作系统)完全相同的文件,并有相同的结果。
更新
当在一个完全不同的项目中使用REG ADD
时,我遇到类似的“在SFX档案之外的作品,但不是从一个”的问题。 我只是不认为SFX档案与batch file打好。
我认为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/zh-cn/library/windows/desktop/aa384187(v=vs.85) .aspx享受!
这适用于Windows 7:
taskkill /f /IM explorer.exe start explorer.exe exit
我有这个相同的问题,发现这里的所有解决方案仍然不能从批处理脚本工作。
这些都没有完全工作:
start explorer.exe start explorer explorer.exe explorer
因为他们都打开了一个窗口(并没有再次显示任务栏),或批处理脚本然后挂起,不能再执行任何命令
我发现批处理文件中的这一行确实有效(杀死explorer.exe后):
start "" "C:\Windows\explorer.exe"
并且还允许在脚本中执行其他命令
重新启动explorer.exe,这为我工作。
powershell.exe Stop-Process -processname explorer
尝试
%windir%\explorer.exe start %windir%\explorer.exe start /d%windir% explorer.exe
在C#中执行此操作之前,我看到过类似的问题。 该进程必须通过调用浏览器的外壳而不是浏览器窗口来调用,但我没有任何批处理问题。
尝试使用这个:
taskkill /im explorer.exe /f explorer
其他答案之间的区别是explorer
而不是explorer.exe
这已经造成了我以前的问题。
这适用于我的Win7 x64电脑。
希望这可以帮助!
有一天,我正在浏览一些WinRAR的更高级的选项,并遇到了这个标签:
一旦我看到我怀疑它是问题和解决方案的一部分,因为这个问题只发生在Windows 7 x64上。
如怀疑,使用Default64.SFX
模块而不是默认的Default.SFX
模块完全解决了问题。 最后。
与Visual Studio有同样的问题。
什么适合我(Win 7 Pro 64bit):
项目名称上的PPM选择“属性”
配置属性>生成事件>预生成事件
taskkill /im explorer.exe /f
配置属性>生成事件>生成后事件
start "" "C:\Windows\explorer.exe"
但是这会导致其他问题(IDE运行后IDE被冻结),现在我只能重启IDE再次运行build命令。
在x64或x86中使用此(具有管理权限的.bat)
tasklist /fi "imagename eq explorer*" | find /i "explorer*" if not errorlevel 1 (taskkill /f /im "explorer*") else ( start %windir%\explorer.exe
在Windows 7 64位中对我有效的是“C:\ Windows \ expstart.exe”或只是expstart.exe
尝试将一个explorer.exe键添加到注册表中的应用程序路径。
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”
简单的上下文菜单
只需右键单击桌面上,然后选择重新启动Windows资源管理器 。 请享用!