首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go中执行vbscript

在Go中执行vbscript
EN

Stack Overflow用户
提问于 2013-12-03 09:41:49
回答 3查看 1.7K关注 0票数 1

我正在尝试让一个Go程序执行一个vbscript,它添加了几个注册表值。处理此问题的Go代码如下所示:

代码语言:javascript
复制
err = exec.Command("cmd.exe", "/c", "registry.vbs").Run()
if err != nil {
    fmt.Printf("Error: %s\n", err.Error())
}

当我运行我的围棋程序,它会执行这个vbscript的部分,绝对不会发生任何事情。注册表值没有更改,也没有错误。如果我尝试运行以下命令,它就能正常工作:

代码语言:javascript
复制
cmd.exe /c C:\path\to\file\registry.vbs

我尝试过的事情:

  • 在Go程序中添加文件路径
  • 以管理员身份运行Go程序
  • 我尝试使用.Output()而不是.Run(),结果输出等于[ ]

有人知道为什么会这样吗?

任何方向都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-03 10:32:14

在您的场景中,有很多事情可能出错,所以您应该从简单的开始:

(1)给定一个做.vbs而不是的,尝试更改注册表( Windows热切地为其辩护):

代码语言:javascript
复制
MsgBox "ThatsMe"

以及调用

代码语言:javascript
复制
err := exec.Command("cmd.exe", "/c", "ThatMe.vbs").Run()

在同一个文件夹中的.exe中,我收到一个安全警报:“您真的想从映射的网络驱动器E:\中打开ThatsMe.vbs吗?”如果我同意,脚本就会执行,MsgBox就会出现。您的安全设置可能非常严格,甚至没有人问您。

(2)要使上述调用工作,shell必须知道如何处理.VBS文件。您的assoc/ftype设置可能不会提供此信息。然后

代码语言:javascript
复制
err := exec.Command("wscript.exe", "ThatsMe.vbs").Run()

代码语言:javascript
复制
err := exec.Command("cscript.exe", "ThatsMe.vbs").Run()

应该有效-有趣的是,没有安全警告。

(3)与其依赖路径并在同一个文件夹中拥有/执行所有文件/工作,不如绘制完整的文件规范可能是一个好主意:

代码语言:javascript
复制
err := exec.Command(
    "C:/WINDOWS/system32/wscript.exe",
    "E:/trials/SoTrials/answers/10024850/go/ThatsMe.vbs").Run()

(4)如果您可以执行简陋的ThatsMe.vbs,但您的registry.vbs仍然失败,那么您必须研究谁可以查看/更改您感兴趣的注册表的各个部分。也许您必须以管理员身份调用您的可执行文件。

(5)在实验中,我收到了相当不错的错误消息,这些消息来自于我尝试过的(使用%comspec%而不是cmd.exe、坏的文件规范、.)。但是,试图读取一个不存在的注册表项会导致Windows弹出,没有 Go错误。因此,您的“绝对没有发生”的诊断让我怀疑,Windows是否对您隐藏错误消息。在IExplorer高级设置中有一些暗选项,如“显示每个脚本错误的通知”。

票数 5
EN

Stack Overflow用户

发布于 2013-12-03 09:57:35

尝试使用Cscript.exe而不是cmd.exe

Cscript.exe是Windows主机的命令行版本,它为设置脚本属性提供命令行选项。

要获得输出,请使用Output()而不是Run()

完整的例子:

代码语言:javascript
复制
package main

import (
    "fmt"
    "os/exec"
)

func main() {
    if out, err := exec.Command("Cscript.exe", "registry.vbs").Output(); err != nil {
        fmt.Printf("Error: %s\n", err)
    } else {
        fmt.Printf("%s\n", out)
    }
}

使用基于命令行的脚本主机(Cscript.exe)运行脚本 at TechNet。

票数 3
EN

Stack Overflow用户

发布于 2013-12-03 10:22:21

另一种方法是为您的运行默认应用程序文件创建.vbs。通常,这将是wscript.exe

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20347549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档