見出し画像

TWSNMP FC:やっと起動ツールができた

今朝は5時から開発を開始しました。TWSNMPの起動ツールの開発の続きです。Windowsのタスクスケジューラーに登録して起動する機能でコマンドプロンプトのWindowを非表示にできない問題

コマンドプロンプトのWindowを隠したい問題

の解決方法を昨日の夕方やっと見つけました。

です。SchTasksコマンドのパラメータでは指定できないため、

  • 一度コマンドでタスクを登録する

  • XMLでエクスポートする

  • 登録したタスクを削除する

  • XMLを変更してWindowを非表示に設定する

  • 変更したXMLでタスクを登録する

ということをやっています。昨日、これを見つけた時には既に頭が働かない状態だったので組み込む気力がありませんでした。
今朝、GO言語で作ってみました。

// createTask : タスクを登録する
func (b *App) createTask(name string, params []string) error {
	if runtime.GOOS != "windows" {
		return fmt.Errorf("not windows")
	}
	tn := "\\TWSNMP\\" + name
	// 仮のタスクを登録
	cmd := getCmd(b.ctx, "schtasks.exe",
		[]string{"/Create",
			"/TN", tn,
			"/SC", "ONSTART",
			"/NP",
			"/TR", "'" + b.getExec(name) + "'" + makeArg(params)})
	err := cmd.Run()
	if err != nil {
		wails.LogError(b.ctx, fmt.Sprintf("create task err=%v", err))
		return err
	}
	// 作成したタスクのXMLで取得する
	cmd = getCmd(b.ctx, "schtasks.exe",
		[]string{"/Query",
			"/TN", tn,
			"/XML",
		})
	o, err := cmd.CombinedOutput()
	if err != nil {
		wails.LogError(b.ctx, fmt.Sprintf("query task out=%s err=%v", strings.TrimSpace(string(o)), err))
		return err
	}
	// タスクを削除する
	cmd = getCmd(b.ctx, "schtasks.exe",
		[]string{"/Delete",
			"/TN", tn,
			"/F",
		})
	err = cmd.Run()
	if err != nil {
		wails.LogError(b.ctx, fmt.Sprintf("delete task err=%v", err))
		return err
	}
	// 仮タスクのXMLを書き換える
	xml := string(o)
	if strings.Contains(xml, "<Hidden>false</Hidden>") {
		xml = strings.Replace(xml, "<Hidden>false</Hidden>", "<Hidden>true</Hidden>", 1)
	} else {
		xml = strings.Replace(xml, " <Settings>", " <Settings>\n<Hidden>true</Hidden>", 1)
	}
	fp, err := ioutil.TempFile("", "twlauncher")
	if err != nil {
		return err
	}
	defer os.Remove(fp.Name())
	tmpName := fp.Name()
	_, err = fp.WriteString(xml)
	if err != nil {
		wails.LogError(b.ctx, fmt.Sprintf("create task write err=%v", err))
		return err
	}
	fp.Close()
	// XMLからタスクを登録する
	cmd = getCmd(b.ctx, "schtasks.exe", []string{"/Create", "/TN", tn, "/XML", tmpName})
	err = cmd.Run()
	if err != nil {
		wails.LogError(b.ctx, fmt.Sprintf("create task from xml err=%v", err))
		return err
	}
	// 作成したタスクのXMLを確認したい時は以下をコメントアウト
	// wails.LogDebug(b.ctx, fmt.Sprintf("create task out=%s", string(o)))
	return nil
}

のような感じです。うまくできました。

うまく登録できたタスク

この問題を含めてMacでビルドしたWailsのWindows実行ファイルをデバッグするためのファイルにログを出力できるようにしました。

func main() {
	// Create an instance of the app structure
	app := NewApp()
	myLogger := logger.NewDefaultLogger()
	if runtime.GOOS == "windows" && len(os.Args) > 1 && os.Args[1] == "debug" {
		myLogger = logger.NewFileLogger("./twl.log")
	}
	// Create application with options
	err := wails.Run(&options.App{
		Title:             "TWSNMP起動/設定ツール",
		Width:             720,
		Height:            600,
|
		Logger:            myLogger,
		LogLevel:          logger.DEBUG,

のよううに、logger.NewFileLogger("./twl.log")でファイル出力のロガーを作ればよいようです。
Macはログが画面の表示されるので必要ないです。
ちょっとしたノウハウです。
起動ツールの開発の苦労は、

です。一通りできたのでインストーラーに組み込んでテストしています。
Mac版のインストーラーの背景画像を変えてみました。天にいる助手の猫に登場してもらいました。

Mac版インストラーの画面

全体のテストとTwitterで要望いただいたDiscordの通知に色をつける機能を作ったらV1.7.0としてリリースできそうです。

明日に続く


開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。