我是 Applescript 和编程的新用户。
我正在尝试创建一个脚本,该脚本将 1) 通过终端加载 Renpy 项目;2) 然后使用应用程序 Display Maid 中的按键命令将生成的项目窗口移动到不同的显示器。
我可以获得两个可以自行成功运行的不同脚本:
do shell script "/Applications/renpy-7.3.5-sdk/renpy.sh /Users/username/Documents/Renpy\\ projects/projectname"
和
tell application "Display Maid"
activate
tell application "System Events" to keystroke "r" using {control down, command down}
end tell
但是,当我将它们放在一个脚本中时,它永远不会进入第二步。Applescript 似乎想要等到 shell 脚本完全完成后再进入 Display Maid 部分。
我该如何让它工作?我还通过“系统偏好设置”为生成的应用程序授予了可访问性权限,但这并没有改变任何东西。
答案1
do shell script "/Applications/renpy-7.3.5-sdk/renpy.sh ~/Documents/Renpy\\ projects/projectname 2>/dev/null 1>&2 &"
tell application "System Events"
set _P to a reference to process "renpy"
set _W to a reference to window 1 of _P
repeat 20 times -- 10 seconds max. wait
if _W exists then exit repeat
delay 0.5
end repeat
if not (_W exists) then return
set _P's frontmost to true
-- Display Maid's global hotkey to restore window layout
keystroke "r" using {control down, command down}
end tell
答案2
根据 做 shell 脚本圣经,AppleScript 等待 shell 命令退出后才继续。
您可以通过告诉 shell 命令在后台运行并通过以下任一方式抑制命令的 stdout 和 stderr 来绕过这个问题:
do shell script "command > /dev/null 2> file_path &"
do shell script "command > /dev/null 2>&1 &"
抑制> /dev/null
stdout;2>&1
抑制 stderr(具体来说,将 stderr 发送到与 stdout 相同的位置),尾随&
将命令置于后台。
使用此功能将立即将控制权返回给您的 AppleScript 且没有任何结果,而 AppleScript 脚本与后台的 shell 脚本并行运行。
AppleScript 不直接支持获取或操作后台进程,但请参阅此 技术说明。
这会使脚本变成:
do shell script "/Applications/renpy-7.3.5-sdk/renpy.sh /Users/username/Documents/Renpy\\ projects/projectname > /dev/null 2>&1 &
tell application "Display Maid"
activate
tell application "System Events" to keystroke "r" using {control down, command down}
end tell