我正在尝试让一个Go程序执行一个vbscript,它添加了几个注册表值。处理此问题的Go代码如下所示:
err = exec.Command("cmd.exe", "/c", "registry.vbs").Run()
if err != nil {
fmt.Printf("Error: %s\n", err.Error())
}当我运行我的围棋程序,它会执行这个vbscript的部分,绝对不会发生任何事情。注册表值没有更改,也没有错误。如果我尝试运行以下命令,它就能正常工作:
cmd.exe /c C:\path\to\file\registry.vbs我尝试过的事情:
.Output()而不是.Run(),结果输出等于[ ]有人知道为什么会这样吗?
任何方向都将不胜感激。
发布于 2013-12-03 10:32:14
在您的场景中,有很多事情可能出错,所以您应该从简单的开始:
(1)给定一个做.vbs而不是的,尝试更改注册表( Windows热切地为其辩护):
MsgBox "ThatsMe"以及调用
err := exec.Command("cmd.exe", "/c", "ThatMe.vbs").Run()在同一个文件夹中的.exe中,我收到一个安全警报:“您真的想从映射的网络驱动器E:\中打开ThatsMe.vbs吗?”如果我同意,脚本就会执行,MsgBox就会出现。您的安全设置可能非常严格,甚至没有人问您。
(2)要使上述调用工作,shell必须知道如何处理.VBS文件。您的assoc/ftype设置可能不会提供此信息。然后
err := exec.Command("wscript.exe", "ThatsMe.vbs").Run()或
err := exec.Command("cscript.exe", "ThatsMe.vbs").Run()应该有效-有趣的是,没有安全警告。
(3)与其依赖路径并在同一个文件夹中拥有/执行所有文件/工作,不如绘制完整的文件规范可能是一个好主意:
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高级设置中有一些暗选项,如“显示每个脚本错误的通知”。
发布于 2013-12-03 09:57:35
尝试使用Cscript.exe而不是cmd.exe。
Cscript.exe是Windows主机的命令行版本,它为设置脚本属性提供命令行选项。
要获得输出,请使用Output()而不是Run()。
完整的例子:
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。
发布于 2013-12-03 10:22:21
另一种方法是为您的运行默认应用程序文件创建.vbs。通常,这将是wscript.exe。
https://stackoverflow.com/questions/20347549
复制相似问题