这是我的代码:
package main
import (
"bytes"
"fmt"
"io"
"os/exec"
)
func runCommand(command string) io.Writer{
cmdName := "cmd.exe"
cmdArgs := []string{"/c", command}
fmt.Println("Running command: " + command)
cmd := exec.Command(cmdName, cmdArgs...)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
cmd.Run()
return cmd.Stdout
}
func main(){
fmt.Println(runCommand("dir")) // Prints the output of dir for the current directory
fmt.Println(runCommand("dir C:\\")) // Prints nothing
fmt.Println(runCommand("dir C:\\Users\\")) //Prints the output of dir for the users directory
fmt.Println(runCommand("dir C:\\..\\")) // Prints the output of dir for the C drive (What I want)
}
我期望当我执行 dir C:\ 时,我将得到输出,就像我在Windows命令提示符中遇到过一样。相反,我什么也没得到。无可辩驳的是,运行 dir 时的任何其他路径都可以正常工作。我什至可以看到 C:\ ,如果我改为执行 C:\ .. \ ,为什么?我不明白为什么会这样,而且我给它的所有其他Windows命令都可以正常工作。
答案 0 :(得分:1)
首先,永远不要忽略错误。对cmd.Run()
的调用返回错误,您应该始终检查它:
if err := cmd.Run(); err != nil {
fmt.Printf(os.Stderr, "%v", err)
}
尝试一下,您可能会看到命令失败的原因。
在不知道错误的情况下,很难帮助解决您的问题,但是我猜您需要将字符串command
分成几个字段,并将它们附加到cmdArgs
上。运行runCommand("dir C:\\")
时,您的cmdArgs
实际上是[]string{"/c", "dir C:\\")
,我认为应该是[]string{"/c", "dir", "C:\\"}
。看一下函数strings.Split(string, string)
,它可能会对您有所帮助。但这只是一个猜测,我们需要知道您要获得正确解决方案的确切错误信息:)