我试图让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()
这导致输出等于[ ]
有人知道为什么会这样吗?
任何方向将不胜感激.
你的场景中有很多东西可能出错,你应该从简单开始:
(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)不是依赖于PATH并且在同一文件夹中执行/执行所有文件/工作,而是提出完整的文件规范可能是一个好主意:
err := exec.Command( "C:/WINDOWS/system32/wscript.exe", "E:/trials/SoTrials/answers/10024850/go/ThatsMe.vbs").Run()
(4)如果您可以执行简陋的ThatsMe.vbs,但您的registry.vbs仍然失败,那么您必须研究谁可以查看/更改您感兴趣的注册表部分.也许您必须调用您的可执行文件作为管理员.
(5)在进行实验时,我从Go获得了相当不错的错误消息,用于我尝试的(非)预期的令人讨厌的东西(使用%comspec%而不是cmd.exe,错误的文件规范,......).但是,尝试读取不存在的注册表项会导致Windows脚本主机错误弹出,并且没有 Go错误.所以你的"绝对没有发生"的诊断让我想知道,Windows是否隐藏了你的错误信息.IExplorer高级设置中有一些黑暗选项,如"显示有关每个脚本错误的通知".