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

标签 postgresql shell vbscript batch-file installation

在我的 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% 而不是直接调用批处理?

关于#2,这是否是因为直接执行 .bat 会假设与 .bat 文件关联的默认操作是执行它?我过去(在其他机器上)将此默认操作更改为“编辑”。如果我这样做了,我也会挂起 PostgreSQL 安装程序! (我想象)

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

  1. 上下文菜单操作仅包含“打开”,缺少“编辑”、“运行”、“运行方式”
  2. 双击批处理文件会打开命令提示符,但不执行批处理文件

刚刚在写这篇文章时注意到了#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/

相关文章:

sql - sql中的串行数据类型

linux - 如何查找和删除字符串中的多个子字符串

xml - 使用 VBScript 遍历 XML 文件中的所有节点

c# - 如何使用命令行回收远程机器上的应用程序池

sql - 选择相邻表中具有多个其他行的行

sql - 如何使用参数/变量并一起解释

postgresql - 无法恢复 postgres 数据库

java - Runtime.getRuntime().exec() 执行两行?

Shell 命令 - 基于命令输出的条件?

linux - 带输入的批处理脚本。 ADB 命令、FireStick