在引用同一应用程序的多个实例时,谁能想到 osascript index-by-name 瓶颈的解决方法?
如果我们获得两个进程 id——一个对应于同一应用程序的两个不同实例中的每一个,则 osascript 返回相同的实例以换取其中一个 pid——就好像它首先将 pid 映射到一个应用程序名称,然后检索第一个应用程序进程那个名字。
例如,启动两个不同的 VLC.app 实例,播放两个不同的视频文件,例如:
open -na /Applications/VLC.app ~/fileA.m4v
open -na /Applications/VLC.app ~/fileB.m4v
然后获取两个单独的应用程序进程 ID,例如:
echo "$(ps -ceo pid=,comm= | awk '/VLC/ { print $1}')"
然后,我们可以使用 Applescript 或 Yosemite JXA Javascript 从任一 pid 获取对应用程序对象的引用。
然而,事实证明,无论我们提供哪个进程 ID,我们总是返回对同一实例的引用,运行相同的视频文件,好像 osascript 只是将 pid 转换为应用程序名称,然后总是返回第一个进程匹配那个名字。
优胜美地 Javascript 应用程序:
function run() {
var app = Application.currentApplication();
app.includeStandardAdditions = true;
var lstVLC = app.doShellScript(
"echo \"$(ps -ceo pid=,comm= | awk '/VLC/ { print $1}')\""
).split(/[\r\n]/).map(Number).map(Application);
return {
firstInstance: lstVLC[0].windows[0].name(),
secondInstance: lstVLC[1].windows[0].name()
};
}
苹果脚本:
on run {}
set strCMD to "echo \"$(ps -ceo pid=,comm= | awk '/VLC/ { print $1}')\""
set lstNum to paragraphs of (do shell script strCMD)
repeat with i from 1 to length of lstNum
set item i of lstNum to (item i of lstNum) as number
end repeat
tell application "System Events"
set oProcA to first application process where unix id = (item 1 of lstNum)
set oProcB to first application process where unix id = (item 2 of lstNum)
end tell
return [name of first window of oProcA, name of first window of oProcB]
end run
关于分别为每个实例编写脚本的路线有什么想法吗?