Go言語でコマンドプロンプトを起動しexeの実行

Go_icon Go
この記事は約5分で読めます。

この記事は以下の方を対象に書いています。

  • コマンドプロンプトの操作方法を知りたい
  • Goのexeファイルから別のexeファイルと起動したい

実現したいこと

今回は、Go言語のプログラムから、別のexeファイルを起動したいと思います。

イメージとしてはこんな感じです。(伝わりづらかったらすみません。。)

go-sample-1
実現したいことのイメージ

これを見て、「C#のプログラムそのまま起動したらダメなの?」と思われた方もいると思います。

ですが、このような構成にすることで、Go言語で何らかの処理をした後に、

exeを起動するかしないかの判定をすることが可能になります。

その他にも、条件によって様々なexeを起動できるようになります。

サンプルコード

前置きが長くなってしまいましたが、ここからは実際のサンプルコードを紹介します。

package main

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

func main() {
	// コマンドプロンプトを開くコマンドを定義
	cmd := exec.Command("cmd")

	// コマンドの設定
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	// コマンドプロンプトを開きます
	if err := cmd.Start(); err != nil {
		fmt.Println("コマンドプロンプトウィンドウの起動エラー:", err)
		return
	}

	fmt.Println("コマンドプロンプトウィンドウを開きました。")

	// コマンドプロンプトで.exeファイルを実行
	// 実行したい.exeファイルパスと引数を指定
	exePath := "target/BlogSample.exe"
	exeArgs := []string{"引数1", "引数2"}

	exeCmd := exec.Command(exePath, exeArgs...)
	exeCmd.Stdout = os.Stdout
	exeCmd.Stderr = os.Stderr

	if err := exeCmd.Run(); err != nil {
		fmt.Println("exeファイルの実行エラー:", err)
	}

	// コマンドプロンプトプロセスの終了を待つ
	if err := cmd.Wait(); err != nil {
		fmt.Println("コマンドプロンプトウィンドウの終了エラー:", err)
	}
}

コード解説

ここからは、上記のサンプルコードのポイントとなる箇所の解説をしていきます。

コマンドプロンプトの起動

別のexeファイルを起動するために、まずはコマンドプロンプトの起動をしています。

11行目でコマンドプロンプトを開くためのコマンドの定義をしています。

その後、Start()関数やRun()関数を使用してコマンドの実行をしています。

コマンドの設定

その後、14~16行目でコマンドの設定をしています。

cmdは、上記で解説したコマンドプロンプトを開くためのコマンドの変数です。

cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

1行目は、コマンドの標準入力を現在のプログラムの標準入力に接続するものです。

2行目は、コマンドの標準出力を現在のプログラムの標準出力に接続するものです。

3行目は、コマンドの標準エラー出力を現在のプログラムの標準エラー出力に接続するものです。

このように設定をすることで、コマンドの実行結果やエラーを取得できるようになります。

別のexe実行

そのあとは、exeを実行します。

これが、起動しているコマンドプロンプトにexe実行のコマンドを渡すコードです。

exePath := "target/BlogSample.exe"
exeArgs := []string{"引数1", "引数2"}

exeCmd := exec.Command(exePath, exeArgs...)
exeCmd.Stdout = os.Stdout
exeCmd.Stderr = os.Stderr

if err := exeCmd.Run(); err != nil {
	fmt.Println("exeファイルの実行エラー:", err)
}

まずは、exeファイルのパスを設定します。

(今回は相対パスで記述:実行するプログラムから見た場所)

その後、実行するコマンドの定義をします。

ここでは、引数を「exeArgs」という変数に入れています。

今回は、特に引数はなしで良いので、日本語になっています。

引数が日本語になっていて引数として成立はしないですが、この影響でエラーになることはありません。

それは、無効な引数はコマンドプロンプト側で勝手に判断し無視してくれるためです。

最後に

ここまで、読んでいただきありがとうございます。

今回のような状況は稀だと思いますが、少しでも参考になれば幸いです。

コメント

タイトルとURLをコピーしました