在golang中运行windows命令

在golang中运行windows命令,windows,go,cmd,Windows,Go,Cmd,我见过从Golang程序运行windows命令的现有解决方案,但没有一个适合我。 我的目标是从go程序中打开一个.png文件 下面是示例程序。它不会打开图像文件。我正在尝试使用dir进行测试。 主程序包 进口( “日志” “操作系统” “os/exec” “运行时” ) func main(){ cmd:=exec.Command(“ls”,“-lah”) 如果runtime.GOOS==“windows”{ cmd=exec.Command(“cmd”、“dir”) } cmd.Stdout=

我见过从Golang程序运行windows命令的现有解决方案,但没有一个适合我。 我的目标是从go程序中打开一个
.png
文件

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

主程序包
进口(
“日志”
“操作系统”
“os/exec”
“运行时”
)
func main(){
cmd:=exec.Command(“ls”,“-lah”)
如果runtime.GOOS==“windows”{
cmd=exec.Command(“cmd”、“dir”)
}
cmd.Stdout=os.Stdout
err:=cmd.Run()
如果错误!=零{
log.Fatalf(“cmd.Run()失败,出现%s\n”,错误)
}
}
我还在第13行中尝试了
cmd=exec.Command(“dir”)
。 程序只是存在,没有任何错误或输出。似乎是一个成功的执行,因为没有错误显示给我。我尝试了一些变化,但没有成功

我正在使用VSCode,并尝试通过VSCode中的内置
cmd
wsl
运行此程序当我使用
wsl
运行程序时,它会显示
ls-lah
的输出,但cmd的输出不显示。 我不知道是否有某种方法可以引导windows输出。 感谢您的帮助。
谢谢。

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)
}
打开BMP文件的简单方法是
cmd=exec.Command(“explorer.exe”、“test.BMP”)
(这将使用任何默认应用程序打开它)

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


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

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)
}
打开BMP文件的简单方法是
cmd=exec.Command(“explorer.exe”、“test.BMP”)
(这将使用任何默认应用程序打开它)

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


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

正如英国人所解释的,只有在请求Windows内部命令时,错误才会出现。因此,为了避免对文件路径进行检查,我创建了一个与Windows内部命令同名的本地批处理文件,例如,如果我想运行“ECHO”命令,我可以创建一个包含“@ECHO%1”的ECHO.bat文件。刚刚测试过,相同的代码现在可以在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()

正如英国人所解释的,错误似乎只有在请求Windows内部命令时才会出现。因此,为了避免对文件路径进行检查,我创建了一个与Windows内部命令同名的本地批处理文件,例如,如果我想运行“ECHO”命令,我可以创建一个包含“@ECHO%1”的ECHO.bat文件。刚刚测试过,相同的代码现在可以在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()

如果在Windows的提示下运行
cmd dir
,它会工作吗?不会,但我也尝试了cmd=exec.Command(“dir”)。英国人的解释澄清了这一点。谢谢如果你在Windows的提示下运行了
cmd dir
,它会工作吗?不会,但我也尝试了cmd=exec.Command(“dir”)。英国人的解释澄清了这一点。谢谢你的解释。它消除了我的困惑,也很有效。谢谢你的解释。它消除了我的困惑,也很有效。欢迎来到SO!请参考你所说的答案。当你说“高于”时,它可能会误导你,因为其他答案可能会被添加,并获得比你更多的选票。或者,您的答案可以成为答案并登上顶部。谢谢您的评论。刚刚做了一个编辑来澄清。欢迎来到SO!请参考你所说的答案。当你说“高于”时,它可能会误导你,因为其他答案可能会被添加,并获得比你更多的选票。还是你的答案