我正在使用以下脚本
<?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>my.script.keeprunning</string>
<key>KeepAlive</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/path/to/file</string>
</array>
</dict>
</plist>
即使应用程序崩溃也能运行,但系统重启后焦点会切换到该特定应用程序。我该如何改进脚本以隐藏或最小化运行应用程序?为它编写 applescript 并将其作为服务运行会更容易吗?
谢谢你的建议 ;)
答案1
我有一个解决类似问题的脚本,这里是一个已经在几个不同的应用程序上测试过的修改版本。
on idle
tell application "System Events"
set pName to the name of every process
if pName does not contain "MY APPLICATION" then
do shell script "open -g /Applications/MY APPLICATION.app"
-- or wherever your application is
else if pName contains "MY APPLICATION" then
set makeFalse to visible of window 1 of application "MY APPLICATION"
if makeFalse is true then set visible of window 1 of application "MY APPLICATION" to false
end if
end tell
end idle
请注意,此脚本应保存为“保持打开”应用程序,并可添加到启动项列表中,以便在您重新启动系统时自动加载。
一旦运行,脚本将执行以下操作:
- 检查正在运行的进程以查看您的应用程序是否已打开。
- 如果您的应用不在列表中,它将使用命令在后台打开它
do shell script "open -g
。 - 如果应用程序已打开,它将隐藏主窗口。
- 处理程序
on idle
将每 30 秒自动检查一次。如果您想要更长的延迟,您可以添加return
,然后输入您希望脚本在再次检查之前等待的秒数(例如return 300
五分钟)。这应该在之前添加end idle
我用此信息隐藏应用程序的 Dock 图标并让其完全在后台运行。
答案2
例如将此 plist 保存为~/Library/LaunchAgents/some.label.plist
:
<?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>some.label</string>
<key>ProgramArguments</key>
<array>
<string>lsappinfo</string>
<string>launch</string>
<string>launchandhide=true</string>
<string>nofront=true</string>
<string>/Applications/Mail.app</string>
</array>
<key>StartInterval</key>
<integer>60</integer> <!-- run the program every 60 seconds -->
</dict>
</plist>
然后运行launchctl load ~/Library/LaunchAgents/some.label.plist
。
您也可以使用open -jga Mail
或pgrep -qx Mail||open -jga Mail
代替lsappinfo launch launchandhide=true nofront=true /Applications/Mail.app
。open -jg
打开隐藏的应用程序,但不将其置于最前面,但对于某些应用程序(如 Mail 和 TextEdit),如果应用程序正在运行但没有打开窗口,它会创建一个新的可见窗口。对于这些应用程序,您可以使用 来pgrep
检查应用程序是否已打开。
lsappinfo
于 10.9 版新增open -j
,pgrep
于 10.8 版新增。