【问题标题】:VBScript works great when I run it from command prompt but not from within Inno Setup当我从命令提示符而不是在 Inno Setup 中运行 VBScript 时,它运行良好
【发布时间】:2017-02-06 20:56:57
【问题描述】:

我有一个我编写的 VBScript,效果很好!当我从 Windows 10 中的命令行运行它时,它可以完美地完成我需要它的一切。

cscript.exe "C:\SetupTempPath\MyScript.vbs" "First Param" 1234 "Third Param"

由于某种原因,当我在我的 Inno 设置脚本中使用它时...

Filename: "{sys}\cscript.exe"; \
  Parameters: """{tmp}\MyScript.vbs"" ""{code:GetStringValue}"" {#PORT} ""{#NAME}"""; \
  Description: "Set port to {#PORT}."; \
  StatusMsg: "Setting the port to {#PORT}."; \
  Tasks: setPortNumber; \
  Check: SetTcpPort({#PORT});

当我在调试模式下运行安装程序时,它会显示以下内容...

[12:37:45.377] -- Run entry --
[12:37:45.378] Run as: Current user
[12:37:45.380] Type: Exec
[12:37:45.381] Filename: C:\WINDOWS\system32\cscript.exe
[12:37:45.425] Parameters: "C:\SetupTempPath\MyScript.vbs" "First Param" 1234 "Third Param"
[12:38:04.987] Process exit code: 0
[12:38:04.995] Need to restart Windows? No
[12:38:06.944] Deinitializing Setup.
[12:38:06.997] *** Setup exit code: 0

如您所见,一切都从代码函数以及定义的 Inno Setup 常量(定义)中成功解决。

我最终在 VBScript 中放置了一堆 MsgBox 行来检查状态并查看何时出错。我最终发现了它有问题的 VBScript 部分(仅在从 Inno Setup 运行时)所以我调整了脚本以解决一些错误控制,这是结果...

Set wmiComputer = GetObject(wmiObjectQuery)
Set tcpProperties = wmiComputer.ExecQuery(wmiQuery)

MsgBox "Break! Count: " & tcpProperties.Count
If Err.Number <> 0 Then
    MsgBox "Query returned no results.", 0, "Port not changed!"
    WScript.Quit
End If

一步一步来,一切都是一样的。 wmiObjectQuery 字符串是一样的,我创建的 wmiQuery 是一样的。除了ONE,我没有发现任何差异。当ExecQuery() 被调用并且我从命令提示符运行它时(安装程序正在等待我关闭它),它返回TWO 记录。另一方面,当我让 setup 尝试运行它时,最终会触发错误控制,因为 tcpProperties.Count 失败(由于未设置 tcpProperties)。

所以我的问题是,为什么它可以从命令提示符而不是 Inno Setup 脚本完美运行?

【问题讨论】:

  • 会不会是在 Inno Setup 中运行脚本的安全上下文有区别?
  • 我不确定你的意思。对我而言,如果我从 UserA 的登录名中同时运行设置应用程序和命令提示符,那么就安全性而言,应该使用相同的权限。
  • 不一定,通过 elevated 命令提示自行运行它可能与 Inno Setup 执行当前用户上下文的方式完全不同。因此,通常可以工作的 WMI 命令可能会失败,因为 似乎 正在这里发生。
  • 我没有提升任何东西。另外,我关闭了UAC。我只需双击 Setup 应用程序,就像双击 cmd.exe 应用程序一样。
  • 好的,但是从您问题的日志中它指向权限/上下文问题。我不建议直接取消它,因为您认为这不是问题。 UAC 在更高版本的 Windows 中从未完全关闭,仍然认为问题出在程序运行的上下文中。

标签: vbscript inno-setup


【解决方案1】:

只是猜测:Inno Setup 执行 32 位 cscript。在命令行上,您执行 64 位 cscript。这可以有所作为。

尝试将Flags: 64bit 添加到您的[Run] 条目中。


Inno Setup 安装程序是 32 位应用程序,因此默认情况下会查找 32 位版本的 cscript (C:\Windows\SysWOW64\cscript)。

另请参阅 Inno Setup 文档中的 Install Mode: 32-bit vs. 64-bit 文章。

【讨论】:

  • 大声笑我正要写下我的下一条评论! Inno 以 64 位运行,命令提示符以 32 位运行!
  • 谢谢马丁!那面旗帜钉了它!我知道这将归结为我需要使用的 inno 标志。 Inno 中有很多功能,通常有一种方法可以完成工作。
  • PS:我不认为在没有臭名昭著的@Martin 编辑的情况下我可以发布Inno Setup 问题。 - 谢谢!
猜你喜欢
  • 2012-04-25
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 2015-12-10
  • 2019-05-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多