如何在Golang中执行简单的Windows命令?

时间:2012-10-22 09:18:42

标签: windows go cmd

如何运行简单的 Windows命令

此命令:

exec.Command("del", "c:\\aaa.txt")

..输出此消息:

  

del:%path%

中找不到可执行文件

我做错了什么?

6 个答案:

答案 0 :(得分:41)

我遇到了和你一样的错误。 但是dystroy是正确的:你不能运行delcmd中内置的任何其他命令,因为没有del.exe文件(或任何其他del-executable)。

我得到了它:

package main

import(
    "fmt"
    "os/exec"
)

func main(){    
    c := exec.Command("cmd", "/C", "del", "D:\\a.txt")

    if err := c.Run(); err != nil { 
        fmt.Println("Error: ", err)
    }   
}

答案 1 :(得分:6)

您需要Windows cmd才能执行dir命令。

试试这个:

cmd := exec.Command("cmd", "/C dir").Output()

(抱歉,目前没有Windows计算机可以检查)

答案 2 :(得分:1)

也找到了另一种解决方案。创建包含以下内容的批处理文件:del c:\ aaa.txt

然后这样称呼:

exec.Command("c:\\del.bat").Run()

答案 3 :(得分:1)

如果您需要cmd的输出:

if c, err := exec.Command("cmd","/c","del","a.txt").CombinedOutput(); err != nil {
        log.Fatal(err)
    } else {
        fmt.Printf("%s\n", c)
    }

答案 4 :(得分:0)

好吧,根据documentation,让我们看一下在Windows中,进程将命令作为单行字符串接收并自行进行一些解析。 Exec的Command函数通过使用CommandLineToArgvW将所有参数组合在一起来构建命令字符串,尽管这是最常见的引用算法,但并不是对每个应用程序都有效。诸如msiexec.exe和cmd.exe之类的应用程序使用不兼容的取消引用算法,因此需要额外的努力。 这是使用powershell的另一个示例

package main

import (
        "os/exec"
        "fmt"
        "log"
        )
func main() {
     out, err := exec.Command("powershell","remove-item","aaa.txt").Output()
     if err != nil {
         log.Fatal(err)
     } else {
         fmt.Printf("%s",out)
     }

答案 5 :(得分:0)

您可以尝试使用github.com/go-cmd/cmd模块。
因为golang默认无法使用syscall。

示例:

import (
    "fmt"
    "time"
    "github.com/go-cmd/cmd"
)

func main() {
    // Start a long-running process, capture stdout and stderr
    findCmd := cmd.NewCmd("find", "/", "--name", "needle")
    statusChan := findCmd.Start() // non-blocking

    ticker := time.NewTicker(2 * time.Second)

    // Print last line of stdout every 2s
    go func() {
        for range ticker.C {
            status := findCmd.Status()
            n := len(status.Stdout)
            fmt.Println(status.Stdout[n-1])
        }
    }()

    // Stop command after 1 hour
    go func() {
        <-time.After(1 * time.Hour)
        findCmd.Stop()
    }()

    // Check if command is done
    select {
    case finalStatus := <-statusChan:
        // done
    default:
        // no, still running
    }

    // Block waiting for command to exit, be stopped, or be killed
    finalStatus := <-statusChan
}