使用WShell启动批处理文件时VBScript挂起。运行
在我的Windows 7 64位Home Premium框中安装PostgreSQL 9.1.2期间,挂起安装。经过长时间的激烈搜索,我发现问题是安装程序VB脚本挂起,等待批处理文件在隐藏窗口中完成。使用WShell启动批处理文件时VBScript挂起。运行
予分离问题到下面的行的代码:
Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "hello.bat", 1, True
(其中1
套WindowStyle于可见光和True
等待完成)。 Run
调用已启动命令提示符,但未执行批处理文件。因此,它永远不会完成。
我直接启动cmd.exe的批处理文件,而不是解决了这个问题,根据大量的在线来源:
objShell.Run "%COMSPEC% /c hello.bat", 1, True
由于修复埋在PostgreSQL安装程序(我已经提交了bug report ),除非安装程序被修改,否则我只能使用work around这个问题。
但是我的主要问题是:
- 为什么第一个电话挂?
- 为什么要使用%COMSPEC%而不是直接调用批处理?
关于#2,这可能是因为执行.bat直接假定与.bat文件关联的默认操作是执行它吗?我过去(在其他机器上)将此默认操作更改为“编辑”。如果我这样做了,我也会挂上PostgreSQL安装程序! (我想)
批处理文件在其他机器上正常执行。所以这台笔记本电脑有些奇怪。所以,对于#1,我需要弄清楚为什么这一台笔记本电脑是不同的。我要指出,有与批处理文件中有一些奇怪的行为,这台机器上(其中一个我只注意到):
- 的上下文菜单操作只包含“打开”,缺少“编辑”,“运行”,“运行方式”
- 双击一个批处理文件,打开命令提示符,但不执行批处理文件
在写这个我只是注意到#2。显然,.bat的默认操作会搞乱。昨天我几乎把我的电脑从我的注册表中删除了上下文菜单处理程序,正如几个网站试图恢复我的“编辑”,“运行”等条目所建议的那样。
关于问题1和2的任何意见,将不胜感激。
感谢, 埃里克
问题是在.bat上创建了与cmd.exe的关联的HKCU重写,如this wonderful post所述。额外的帮助被发现here。
我的注册表是这样的:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bat
\OpenWithList
(Default) REG_SZ (value not set)
a REG_SZ NOTEPAD.EXE
MRUList REG_SZ a
\OpenWithProgids
(Default) REG_SZ (value not set)
batfile REG_NONE (zero-length binary value)
\UserChoice
(Default) REG_SZ (value not set)
Progid REG_SZ (Applications\cmd.exe)
删除整个.bat
进入固定的一切。所有上下文菜单项都已正确恢复(Open
,Edit
,Print
,Run as Administrator
和Troubleshoot Compatability
),然后双击批处理文件执行批处理。
在删除它并双击我的测试批处理文件后,某些时候.bat键会自动重新生成。这个自动生成的条目是:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bat
\OpenWithList
(Default) REG_SZ (value not set)
\OpenWithProgids
(Default) REG_SZ (value not set)
batfile REG_NONE (zero-length binary value)
最终它是导致我的问题的\UserChoice
密钥。所以我现在都清理了。我的测试脚本运行正常,我重新安装了PostgreSQL,安装顺利。
E
+1可以自行解决并分享详细的解决方案。 – Tomalak 2012-01-30 09:32:42
第一个呼叫启动直到东西告诉它关闭仍保持开放的窗口。大概hello.bat以EXIT命令终止,这当然会关闭窗口,然后您的安装可以继续。
但hello.bat无法在您的一台机器上运行,所以当然窗口永远不会关闭,并且您的安装挂起。
通过%COMSPEC%的第二次调用打开一个窗口并使用/ C“command”选项运行CMD.EXE。/C选项的说明指出,一旦“命令”完成(或失败),CMD.EXE将终止。你的“命令”是“hello.bat”。窗口的关闭不再依赖于hello.bat文件中的EXIT命令。即使hello.bat无法运行,该窗口也会关闭。
感谢您输入的dbenham。 hello.bat是一个简单的“echo hello> _hello.txt”,没有明确的EXIT。问题是hello.bat实际上没有被调用。命令提示符出现,但批处理文件未运行。这并不是说bat文件在运行时失败了。它根本不叫! Re:你的第二点 - 即使没有明确的EXIT命令,批处理文件也会退出。如果批处理文件正在运行并挂起,则cmd.exe/c仍会挂起,等待命令完成。 我的问题竟然是一个文件扩展名重写(请参阅我自己的答案)。尽管感谢您的意见! – cod3monk3y 2012-01-28 04:44:31
我解决了这个问题,并会在7个小时内发布答案(新用户,抱歉)。基本上我必须删除这个键:HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts \ .bat,如[注意] [http://help.lockergnome.com/windows/BAT-File-Association-Broken- -ftopict514456.html) – cod3monk3y 2012-01-27 20:08:42