【问题标题】:VBScript hangs when launching batch file with WShell.Script Run使用 WShell.Script Run 启动批处理文件时 VBScript 挂起
【发布时间】:2023-03-27 08:53:02
【问题描述】:

在我的 Windows 7 64 位家庭高级版机器上安装 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 的任何建议将不胜感激。

谢谢, 埃里克

【问题讨论】:

  • 我已经解决了这个问题,并将在 7 小时内发布答案(新用户,对不起)。基本上我不得不删除这个键: HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bat 如注here

标签: postgresql shell vbscript batch-file installation


【解决方案1】:

问题是 .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 条目修复了所有问题。所有上下文菜单项均已正确恢复(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 用于自行解决并分享详细的解决方案。
【解决方案2】:

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

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

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

【讨论】:

  • 感谢 dbenham 的输入。 hello.bat 是一个简单的“echo hello > _hello.txt”,没有明确的 EXIT。问题是 hello.bat 实际上没有被调用。命令提示符出现,但批处理文件没有运行。不是bat文件在运行时失败;它根本没有被调用!回复:您的第二点 - 即使没有明确的 EXIT 命令,批处理文件也会退出。如果批处理文件正在运行并挂起,cmd.exe /c 仍会挂起,等待命令完成。我的问题原来是文件扩展名覆盖(请参阅我自己的答案)。不过,感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 2011-01-07
  • 2012-08-07
相关资源
最近更新 更多