実現したいこと
今回は、Go言語のプログラムから、別のexeファイルを起動したいと思います。
イメージとしてはこんな感じです。(伝わりづらかったらすみません。。)
これを見て、「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」という変数に入れています。
今回は、特に引数はなしで良いので、日本語になっています。
引数が日本語になっていて引数として成立はしないですが、この影響でエラーになることはありません。
それは、無効な引数はコマンドプロンプト側で勝手に判断し無視してくれるためです。
最後に
ここまで、読んでいただきありがとうございます。
今回のような状況は稀だと思いますが、少しでも参考になれば幸いです。
コメント