はじめに
とある所で、Goで作られたWindows上で、実行できるコマンドを見かけた。
自分の中でWindows上で、実行できるコマンドというと、Visual Basic とか Delphi とかのイメージがあり自分には縁遠い存在と思っていました。
そんな中、お!Goで作れるんだ!ということを知り、とりあえず簡単で使いたいものをGeminiに教わりながら作ってみました。
作ったもの
自宅のDockerで管理している趣味管理システムをいつもお気に入りから起動していたので、起動するコマンド
手順
Geminiにソースを作ってもらう。
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
// コマンドライン引数をチェック
// 期待する引数は "hms" です。
if len(os.Args) < 2 {
fmt.Println("Usage: home <service>")
fmt.Println("Example: home hms")
return
}
service := os.Args[1] // 最初の引数 ("hms") を取得
var url string
// 引数に基づいて開くURLを決定
switch service {
case "hms":
url = "http://192.168.10.10/hms"
case "mp4": // 例として別のサービスを追加
url = "http://192.168.10.11/"
default:
fmt.Printf("Unknown service: %s\n", service)
return
}
// Windowsの 'start' コマンドを使用してブラウザでURLを開く
// cmd.exeの 'start' コマンドは、指定されたファイルをデフォルトの関連付けられたプログラムで開きます。
// この場合、URLなのでデフォルトのブラウザで開かれます。
// `/c` はコマンド実行後ウィンドウを閉じるためのオプションですが、ここでは 'start' が非同期にブラウザを起動するため不要です。
// 正しくは、`start` コマンド自体を `cmd.exe` を使って実行します。
// cmd /c start "" "URL" の形式で実行します。
// 最初の "" はウィンドウタイトルとして必要です。
cmd := exec.Command("cmd", "/c", "start", "", url)
err := cmd.Run()
if err != nil {
fmt.Printf("Error launching browser: %v\n", err)
return
}
fmt.Printf("Launched browser for service '%s' at %s\n", service, url)
}
フォルダ構成
Geminiに教えて貰いながら、一応、こんな感じ。
C:\dev\vscode\workspace\hcmd-go>tree /f
Folder PATH listing for volume Windows
Volume serial number is A037-99C2
C:.
│ home.exe
│ README.md
│
└───cmd
main.go
ビルド
C:\dev\vscode\workspace\hcmd-go>go build -o home.exe cmd/main.go
出来上がったので、実行してみる
C:\dev\vscode\workspace\hcmd-go>home hms
Windowsのパスに追加して、永続的に利用
「環境変数を編集」から「C:\dev\vscode\workspace\hcmd-go」を追加
ソース
感想
更にモリモリオプションを追加してみたくなってきました。
次はマジックパケットを送信するオプションを追加しようかと、目論んでおります。