在 golang 中运行 Windows 命令

Ab1*_*010 1 windows cmd go

我已经看到了从 Golang 程序运行 Windows 命令的现有解决方案,但没有一个适合我。.png我的目标是从 go 程序打开文件。

下面是示例程序。它不会打开图像文件。我只是尝试dir进行测试。

package main

import (
    "log"
    "os"
    "os/exec"
    "runtime"
)

func main() {
    cmd := exec.Command("ls", "-lah")
    if runtime.GOOS == "windows" {
        cmd = exec.Command("cmd", "dir")
    }
    cmd.Stdout = os.Stdout

    err := cmd.Run()
    if err != nil {
        log.Fatalf("cmd.Run() failed with %s\n", err)
    }
}
Run Code Online (Sandbox Code Playgroud)

我也在cmd = exec.Command("dir")第 13 行尝试过。该程序只是存在,没有任何错误或输出。看起来执行成功,因为没有向我显示错误。我尝试了一些变化但没有成功。

我正在使用 VSCode 并尝试通过内置cmdwsl在 VSCode 中运行该程序。当我用来wsl运行该程序时,它显示 cmd 的输出,ls -lah但没有显示任何内容。我不知道是否有某种方法可以直接windows输出。任何帮助表示赞赏。谢谢。

Bri*_*its 5

cmd.exe是Windows命令解释器;如果您希望向其传递一个要运行的命令,则需要使用 /c 参数 - 例如cmd /c dir。如果你cmd dir在命令提示符下输入,你将得到与当前 go 应用程序相同的结果(除了 cmd 提示符不会由于缺少 stdin 而自动关闭)。如果您运行cmd /?,则解释为:

/C 执行字符串指定的命令然后终止

因此,要修复您的应用程序,请使用以下命令:

cmd = exec.Command("cmd", "/c", "dir")

另一种方法是通过 stdin 传递命令:

cmd := exec.Command("cmd")
cmd.Stdout = os.Stdout
stdin, err := cmd.StdinPipe()
if err != nil {
    log.Fatal(err)
}
go func() {
    defer stdin.Close()
    io.WriteString(stdin, "dir\n")
}()
err = cmd.Run()
if err != nil {
    log.Fatalf("cmd.Run() failed with %s\n", err)
}
Run Code Online (Sandbox Code Playgroud)

打开 BMP 文件的一个简单方法是cmd = exec.Command("explorer.exe", "test.bmp")(这将使用默认应用程序打开它)。

cmd注意:您首先需要运行的原因是这dir是由提供的内部命令cmd.exe(如果您dir dir.* /s在 windows 文件夹中运行,您将找不到任何内容,因为没有dir.exe或类似的;它嵌入在 中cmd.exe)。

注意2:如果您以这种方式运行 ls/dir 来获取文件夹的内容(而不是作为示例),那么ioutil.ReadDir是更好的选择。