繁体   English   中英

在 golang 中运行 windows 命令

[英]Running windows command in golang

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

下面是示例程序。 它不会打开图像文件。 我只是尝试使用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)
    }
}

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

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

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

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

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

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

另一种方法是通过标准输入传递命令:

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

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

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

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

正如英国人所解释的,该错误似乎仅在请求 Windows 内部命令时才会出现。 因此,为了避免对文件路径进行检查,我创建了一个与 Windows 内部命令同名的本地批处理文件,例如,如果我想运行一个“ECHO”命令,我可以创建一个 echo.bat 文件,其中包含“@ECHO %1”。 刚刚测试过,相同的代码现在可以在 Windows 和 Linux 上运行,例如:

    cmd := exec.Command(os.Args[1], os.Args[2:]...)

    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    cmd.Run()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM