hitakiri
@hitakiri

Как вызывать и работать с exe файлом с помощью golang в windows?

Есть exe-шник (for.exe) лежащий в одной папке с go скриптом. for.exe вызывает окно cmd для ввода нескольких параметров, так же к нему можно обращаться из командной строки. Задача - с помощью скрипта на go вызывать for.exe и вводить необходимые параметры.

cmd := exec.Command("cmd", "/C", "C:/gopath/src/script/for.exe")
	err := cmd.Start()
	if err != nil {
		log.Fatal(err)
	}
	var out bytes.Buffer
	cmd.Stdout = &out
	fmt.Printf("Вывод in caps: %q\n", out.String())
	fmt.Printf("Вывод: %v\n", out.String())

Выдаёт пустую строку, хотя при запуске for.exe отдаёт в командную строку "Start"
Ввести параметры
cmd.Stdin = strings.NewReader("param1")
Так же не удаётся.
  • Вопрос задан
  • 2647 просмотров
Решения вопроса 2
tiabc
@tiabc
Бизнес-партнер и консультант по технологиям
В дополнение к ответу Александра, если требуется не только прочитать какие-то данные из сторонней программы, но еще и что-то ввести в ее стандартный поток ввода (как я понял, основная задача именно в этом), можно поступить так:

package main

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

func main() {
	cmd := exec.Command("cmd", "/C", "C:/gopath/src/script/for.exe")

	// Чтобы вводить что-то в стандартный поток ввода другой программы, нужно получить ее pipe.
	pipe, err := cmd.StdinPipe()
	if err != nil {
		log.Fatal(err)
	}
	// Куда впоследствии можно что-то писать.
	pipe.Write([]byte("piggybank"))
	// После ввода всех данных нужно обязательно его закрыть.
	pipe.Close()

	// Самый простой способ получить вывод другой программы, использовать:
	output, err := cmd.Output()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Print(string(output))
}
Ответ написан
package main

import (
	"bufio"
	"fmt"
	"log"
	"os/exec"
)

func main() {
	cmd := exec.Command("cmd", "/C", "C:/gopath/src/script/for.exe")

	// Получаем reader для STDOUT запущенной программы
	// Это нужно делать до её запуска
	stdoutPipe, err := cmd.StdoutPipe()
	if err != nil {
		log.Fatal("Cannot get stdout pipe: ", err)
	}

	// Запускаем команду
	err = cmd.Start()
	if err != nil {
		log.Fatal("Cannot start the command: ", err)
	}

	// Создаём более удобный интерфейс чтения
	r := bufio.NewReader(stdoutPipe)
	// Читаем из stdout одну строку (пока не встретим перевод строки \n)
	str, err := r.ReadString('\n')
	if err != nil {
		log.Fatal("Cannot read from STDOUT: ", err)
	}
	fmt.Println(str)
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы