Windows 在Go中执行vbscript

Windows 在Go中执行vbscript,windows,vbscript,go,Windows,Vbscript,Go,我试图让一个Go程序执行一个vbscript,该脚本添加了几个注册表值。处理此问题的Go代码如下所示: err = exec.Command("cmd.exe", "/c", "registry.vbs").Run() if err != nil { fmt.Printf("Error: %s\n", err.Error()) } 当我运行我的Go程序,它到达执行vbscript的部分时,绝对不会发生任何事情。注册表值没有更改,也没有错误。如果我尝试运行以下命令,它将正常工作: cmd

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

err = exec.Command("cmd.exe", "/c", "registry.vbs").Run()
if err != nil {
    fmt.Printf("Error: %s\n", err.Error())
}
当我运行我的Go程序,它到达执行vbscript的部分时,绝对不会发生任何事情。注册表值没有更改,也没有错误。如果我尝试运行以下命令,它将正常工作:

cmd.exe /c C:\path\to\file\registry.vbs
我尝试过的事情:

在Go程序中添加文件路径 以管理员身份运行Go程序 我尝试使用.Output而不是.Run,结果输出等于[] 有人知道为什么会这样吗

任何指导都将不胜感激。

尝试使用而不是cmd.exe

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

要获取输出,请使用而不是

完整示例:

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)
    }
}
请参阅TechNet。

尝试使用而不是cmd.exe

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

要获取输出,请使用而不是

完整示例:

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)
    }
}

请参阅TechNet。

另一种方法是为.vbs文件创建窗口。通常是wscript.exe。

另一种方法是为.vbs文件创建窗口。通常,这将是wscript.exe。

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

1给定一个.vbs,它不尝试更改Windows极力保护的注册表:

MsgBox "ThatsMe"
以及调用

err := exec.Command("cmd.exe", "/c", "ThatMe.vbs").Run()
从同一文件夹中的.exe中,我收到一个安全警报:是否确实要从映射的网络驱动器E:\打开ThatsMe.vbs。如果我同意,则执行脚本并显示MsgBox。您的安全设置可能非常严格,甚至没有人要求您

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

err := exec.Command("wscript.exe", "ThatsMe.vbs").Run()

应该可以工作-有趣的是没有安全警告

3与其依赖路径,将所有文件/工作放在同一文件夹中,不如提供完整的文件规范:

err := exec.Command(
    "C:/WINDOWS/system32/wscript.exe",
    "E:/trials/SoTrials/answers/10024850/go/ThatsMe.vbs").Run()
4如果您可以执行sme.vbs,但您的registry.vbs仍然失败,那么您必须研究谁可以查看/更改您感兴趣的注册表部分。也许您必须以管理员身份调用可执行文件


5在试验过程中,我从Go获得了相当不错的错误消息,因为我尝试使用%comspec%而不是cmd.exe、糟糕的文件规范。。。。但尝试读取不存在的注册表项会导致Windows脚本主机错误弹出窗口和no Go错误。所以,你的“什么都没发生”诊断让我想知道,Windows是否会对你隐藏错误消息。在IExplorer高级设置中,有一些暗选项,例如显示关于每个脚本错误的通知。

在您的场景中,可能会出现很多错误,您应该开始 简单:

1给定一个.vbs,它不尝试更改Windows极力保护的注册表:

MsgBox "ThatsMe"
以及调用

err := exec.Command("cmd.exe", "/c", "ThatMe.vbs").Run()
从同一文件夹中的.exe中,我收到一个安全警报:是否确实要从映射的网络驱动器E:\打开ThatsMe.vbs。如果我同意,则执行脚本并显示MsgBox。您的安全设置可能非常严格,甚至没有人要求您

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

err := exec.Command("wscript.exe", "ThatsMe.vbs").Run()

应该可以工作-有趣的是没有安全警告

3与其依赖路径,将所有文件/工作放在同一文件夹中,不如提供完整的文件规范:

err := exec.Command(
    "C:/WINDOWS/system32/wscript.exe",
    "E:/trials/SoTrials/answers/10024850/go/ThatsMe.vbs").Run()
4如果您可以执行sme.vbs,但您的registry.vbs仍然失败,那么您必须研究谁可以查看/更改您感兴趣的注册表部分。也许您必须以管理员身份调用可执行文件

5在试验过程中,我从Go获得了相当不错的错误消息,因为我尝试使用%comspec%而不是cmd.exe、糟糕的文件规范。。。。但尝试读取不存在的注册表项会导致Windows脚本主机错误弹出窗口和no Go错误。所以,你的“什么都没发生”诊断让我想知道,Windows是否会对你隐藏错误消息。还有一些暗选项,比如在IExplorer高级设置中显示关于每个脚本错误的通知。

结果是使用cscript.exe和我在中找到的提示UAC的函数解决了问题。感谢您的帮助。事实证明,使用cscript.exe和我在中找到的提示UAC的函数解决了这个问题。谢谢你的帮助。