使用WShell.Script Run启动批处理文件时,VBScript会挂起

时间:2012-01-27 19:28:43

标签: postgresql shell vbscript batch-file install

在我的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出现问题。

但我的主要问题是:

  1. 为什么第一个电话会挂起?
  2. 为什么要使用%COMSPEC%而不是直接调用批处理?
  3. 关于#2,这可能是因为直接执行.bat会假设与.bat文件关联的默认操作是执行它吗?我过去(在其他机器上)将此默认操作更改为“编辑”。如果我这样做了,我也会挂起PostgreSQL安装程序! (我想)

    批处理文件在其他计算机上正常执行。所以在这台笔记本电脑上有一些奇怪的东西。所以关于#1,我需要弄清楚为什么这台笔记本电脑不同。我应该注意到这台机器上有批处理文件有一些奇怪的行为(我注意到了一个):

    1. 上下文菜单操作仅包含“打开”并缺少“编辑”,“运行”,“运行方式”
    2. 双击批处理文件会打开命令提示符,但不会执行批处理文件
    3. 只是在写这篇文章时注意到了#2。很明显,.bat的默认操作搞砸了。昨天我几乎把我的计算机从我的注册表中删除了上下文菜单处理程序,这是几个网站试图恢复我的“编辑”,“运行”等条目的建议。

      对第1和第2个问题的任何建议都表示赞赏。

      谢谢, 埃里克

2 个答案:

答案 0 :(得分:4)

问题是.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条目修复了所有问题。正确恢复了所有上下文菜单项(OpenEditPrintRun as AdministratorTroubleshoot 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,安装顺利进行。

电子

答案 1 :(得分:0)

第一个呼叫启动一个窗口,该窗口保持打开状态,直到有东西告诉它关闭。 Prsumably hello.bat以EXIT命令终止,该命令当然会关闭窗口,然后您的安装可以继续进行。

但是hello.bat无法在你的一台机器上运行,所以当然窗口永远不会关闭,你的安装就会挂起。

通过%COMSPEC%进行的第二次调用是打开一个窗口并使用/ C“command”选项运行CMD.EXE。 / C选项的指定说明一旦“命令”完成(或失败),CMD.EXE将终止。你的“命令”是“hello.bat”。窗口关闭不再依赖于hello.bat文件中的EXIT命令。即使hello.bat无法运行,窗口也会关闭。