如何使用golang运行dir命令?

时间:2018-10-10 12:06:37

标签: go

这是我的代码:

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命令都可以正常工作。

1 个答案:

答案 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),它可能会对您有所帮助。但这只是一个猜测,我们需要知道您要获得正确解决方案的确切错误信息:)