这是我的代码:
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 命令都可以正常工作。
最佳答案
首先,永远不要忽视错误。对 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)
,它可能对你有帮助。但这只是一个猜测,我们需要知道您遇到的确切错误消息才能找到正确的解决方案:)
关于go - 如何使用 golang 运行 dir 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52739895/