golang实现mac、windows开机自启动

作者:
淡白
创建时间:
2022-07-25 19:17:05
Go

摘要:DownTip是一个摸鱼小工具,作者最近在给状态栏小工具添加一些功能模块,其中包括了一个自启动的功能。实现原理是通过在LaunchAgents目录下写入一个启动配置文件,在Mac上实现自启动。在Windows上,作者是在用户启动目录下写入一个bat文件来启动当前二进制。具体实现的代码可以参考上述代码段。

DownTip


DownTip一个摸鱼小工具

我最近在给我的状态栏小工具做一些功能模块,其中我加入了一个自启动的功能在这里分享下。

现状

image

实现

实现原理是在LaunchAgents目录下写入启动配置文件配置说明。 win则是在用户启动目录下写入一个bat来启动当前二进制。

const (
	macListFile = `
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>cn.p00q.tipbar</string>
	<key>ProgramArguments</key>
        <array>
        	<string>/Applications/DownTip.app/Contents/MacOS/down_tip</string>
        </array>
	<key>RunAtLoad</key>
	<true/>
	<key>WorkingDirectory</key>
	<string>/Applications/DownTip.app/Contents/MacOS</string>
	<key>StandardErrorPath</key>
	<string>/tmp/down_tip.err</string>
	<key>StandardOutPath</key>
	<string>/tmp/down_tip.out</string>
</dict>
</plist>
`
	winBat = `start %s`
)

func start(on bool) error {
	var err error
	var path, content string
	current, err := user.Current()
	if err != nil {
		return err
	}
	switch runtime.GOOS {
	case "darwin":
		path = fmt.Sprintf("%s/Library/LaunchAgents/cn.p00q.tipbar.plist", current.HomeDir)
		content = macListFile
	//case "linux":
	case "windows":
		path = fmt.Sprintf("%s\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\down_tip.bat", current.HomeDir)
		abs, _ := filepath.Abs(os.Args[0])
		content = fmt.Sprintf(winBat, abs)
	default:
		return errors.New("不支持的系统")
	}
	return writer(on, path, content)
}
func writer(on bool, path, content string) error {
	var err error
	if on {
		stat, _ := os.Stat(path)
		if stat == nil {
			err = ioutil.WriteFile(path, []byte(content), os.ModePerm)
		}
	} else {
		err = os.Remove(path)
	}
	return err
}