簡體   English   中英

在Go中執行vbscript

[英]Execute a vbscript in 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.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)為了使上述調用起作用,外殼程序必須知道如何處理.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腳本宿主錯誤彈出窗口,並且沒有執行錯誤。 因此,您的“絕對沒有任何反應”的診斷讓我懷疑Windows是否隱藏了您的錯誤消息。 IExplorer Advanced設置中有暗選項,例如“顯示有關每個腳本錯誤的通知”。

嘗試使用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)
    }
}

請參閱TechNet上的“使用基於命令行的腳本宿主(Cscript.exe)運行腳本”

另一種方法是使Windows 運行 .vbs文件的默認應用程序 通常,它將是wscript.exe

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM