見出し画像

TWSNMP FC:Windowsのタスクスケジューラーの設定をGO言語から行う方法を習得

今朝は5時から開発を開始しました。TWSNMPの起動ツールの続きです。前から調べていたWindows環境のタスクスケジューラーへTWSNMP FCやセンサーの起動を登録する機能を作っています。方法はGO言語からWindows標準のschtasks.exeというコマンド

を使ってタスクの登録/削除/起動/停止を行う方法です。
登録の有無は、

// findTask : タスクを検索する
func (b *App) findTask(name string) error {
	if runtime.GOOS != "windows" {
		return fmt.Errorf("not windows")
	}
	cmd := exec.CommandContext(b.ctx, "schtasks.exe", "/Query", "/TN", "\\TWSNMP\\"+name, "/XML")
	return cmd.Run()
}

のような処理で検索できます。
登録は、

// createTask : タスクを登録する
func (b *App) createTask(name string, params []string) error {
	if runtime.GOOS != "windows" {
		return fmt.Errorf("not windows")
	}
	cmd := exec.CommandContext(b.ctx,
		"schtasks.exe", "/Create",
		"/TN", "\\TWSNMP\\"+name,
		"/SC", "ONSTART",
		"/TR", "'"+b.getExec(name)+"'"+makeArg(params),
	)
	o, err := cmd.CombinedOutput()
	if err != nil {
		wails.LogError(b.ctx, fmt.Sprintf("create task out=%s err=%v", strings.TrimSpace(string(o)), err))
		return err
	}
	return nil
}

のような感じです。起動するプログラムのパラメータをどのように渡すかで、少し悩みました。ポイントは、実行ファイルを’シングルクオートで囲むことです。

'e:/twsnmp/twsnmpfc.exe' -datastore "e:/twsnmp/datastore"

のような感じになります。そうするとスケジューラーの登録で実行ファイルと起動パラメータが別れて登録です。
しかし、今の状態だとタスクスケジューラーから起動した時に、コマンドプロンプトのWindowが表示されてしまうので調べています。

Windowsの場合、タスクスケジューラー経由でなくてもGO言語からTWSNMP FCやセンサープログラムを起動した時に、コマンドプロンプトのWindowが表示されます。こちらの問題は、

	cmd := exec.Command(path, params...)

の後に、

	cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}

のようにWindowを隠す設定をすれば解決できました。
タスクスケジューラーの方は、コマンドプロンプトの問題の他に、管理者権限で登録する必要があるなど他にも問題があるので、もう少し調査が必要です。
明日に続く


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