![見出し画像](https://assets.st-note.com/production/uploads/images/68587730/rectangle_large_type_2_3061bf821558fbfaac8359a185c01022.png?width=1200)
TWSNMP FC:やっと起動ツールができた
今朝は5時から開発を開始しました。TWSNMPの起動ツールの開発の続きです。Windowsのタスクスケジューラーに登録して起動する機能でコマンドプロンプトのWindowを非表示にできない問題
![](https://assets.st-note.com/img/1640573990938-Gn4ol8mVF5.png?width=1200)
の解決方法を昨日の夕方やっと見つけました。
です。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
}
のような感じです。うまくできました。
![](https://assets.st-note.com/img/1640574107022-3xlTLLESrJ.png?width=1200)
この問題を含めて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版のインストーラーの背景画像を変えてみました。天にいる助手の猫に登場してもらいました。
![](https://assets.st-note.com/img/1640574648547-SSCALv6BAc.png)
全体のテストとTwitterで要望いただいたDiscordの通知に色をつける機能を作ったらV1.7.0としてリリースできそうです。
明日に続く
いいなと思ったら応援しよう!
![twsnmp](https://assets.st-note.com/production/uploads/images/14333815/profile_ee1accba5615957e5029db85d57fdb0a.jpg?width=600&crop=1:1,smart)