在我的 Windows 7 64 位 Home Premium 机器上安装 PostgreSQL 9.1.2 期间,安装挂起。经过长时间的激烈搜索,我发现问题在于安装程序 VB 脚本挂起,等待批处理文件在隐藏窗口中完成。
我将问题隔离到以下代码行:
Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "hello.bat", 1, True
(其中 1
将 WindowStyle 设置为 Visible,并且 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 上的 HKCU 覆盖,它创建了与 cmd.exe 的关联,如 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
条目修复了所有问题。所有上下文菜单项均已正确恢复(打开
、编辑
、打印
、以管理员身份运行
和排除兼容性问题
)并双击批处理文件执行批处理。
在我删除 .bat key 并双击我的测试批处理文件后,它会自动重新生成。这个自动生成的条目是:
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
关于postgresql - 使用 WShell.Script Run 启动批处理文件时 VBScript 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9038927/