Выполнение команды windows в golang - PullRequest
1 голос
/ 24 февраля 2020

Я видел существующие решения для запуска команды windows из программы Golang, но ни одно из них не работает для меня. Моя цель - открыть файл .png из программы go.

Ниже приведен пример программы. Он не открывает файл изображения. Я просто пытаюсь использовать dir для тестирования.

package main

import (
    "log"
    "os"
    "os/exec"
    "runtime"
)

func main() {
    cmd := exec.Command("ls", "-lah")
    if runtime.GOOS == "windows" {
        cmd = exec.Command("cmd", "dir")
    }
    cmd.Stdout = os.Stdout

    err := cmd.Run()
    if err != nil {
        log.Fatalf("cmd.Run() failed with %s\n", err)
    }
}

Я также пытался cmd = exec.Command("dir") в строке 13. Программа просто существует без каких-либо ошибок или выходных данных. Похоже на успешное выполнение, так как мне не показывают ошибки. Я попробовал несколько вариантов, но безуспешно.

Я использую VSCode и попытался запустить эту программу через встроенные cmd и wsl в VSCode. Когда я использую wsl для запуска программы, она показывает вывод ls -lah, но ничего для cmd . Я не знаю, есть ли способ направить windows вывод. Любая помощь приветствуется. Спасибо.

1 Ответ

3 голосов
/ 24 февраля 2020

cmd.exe - интерпретатор команд windows; если вы хотите sh передать ему команду для запуска, вам нужно использовать параметр / c - например, cmd /c dir. Если вы введете cmd dir в командной строке, вы получите тот же результат, что и ваше текущее приложение go (за исключением того, что командная строка не будет автоматически закрываться из-за отсутствия стандартного ввода). Если вы запускаете cmd /?, это объясняется следующим образом:

/ C Выполняет команду, указанную в строке, а затем завершается

. Чтобы исправить ваше приложение, используйте следующее:

cmd = exec.Command("cmd", "/c", "dir")

Альтернативный способ сделать это - передать команду через стандартный ввод:

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 (если вы запустите dir dir.* /s в папке windows, вы ничего не найдете, потому что нет dir.exe или подобного; оно встроено в cmd.exe).

Примечание2: Если вы были запустив ls / dir таким образом, чтобы получить содержимое папки (а не в качестве примера), тогда ioutil.ReadDir - лучший вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...