当前位置: 首页 > 知识库问答 >
问题:

如何通过osascript处理同一应用程序的两个实例

顾淳
2023-03-14

有人能想出一个变通方法来解决osascript索引按名称瓶颈引用同一应用程序的多个实例吗?

如果我们获得两个进程id-一个用于同一个应用程序的两个不同实例,osascript返回相同的实例来交换其中一个pid-就像它首先将pid映射到一个应用程序名称,然后检索具有该名称的第一个应用程序进程一样。

例如,启动两个不同的VLC实例。应用程序,播放两个不同的视频文件,类似:

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]/).html" target="_blank">map(Number).map(Application);

    return {
        firstInstance: lstVLC[0].windows[0].name(),
        secondInstance: lstVLC[1].windows[0].name()
    };
}

Applescript:

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

对单独编写每个实例的脚本有什么想法吗?

共有3个答案

傅峰
2023-03-14

在Javascript中使用jackjr300的方法,至少可以编写UI脚本(但不能编写应用程序对象界面):

function run() {
    var appSE = Application("System Events");
    app = Application.currentApplication();

    app.includeStandardAdditions = true;

    function uiWidgets(lngID) {
        return appSE.processes.whose({
            unixId: lngID
        })[0].windows[0].uiElements();
    }

    var lstWidgets = app.doShellScript(
            "ps -ceo pid=,comm= | awk '/VLC/ { print $1}'"
        ).split(/\r/).map(Number).map(uiWidgets);

    return lstWidgets;
}
叶俊郎
2023-03-14

这似乎已经在埃尔卡皮坦修复,因为你的JavaScript代码在我的机器上运行良好。

方焱
2023-03-14

对于每个实例,从与特定流程相同的行中询问窗口的名称,如下所示:

set windowNames to {}
set lstNum to paragraphs of (do shell script "ps -ceo pid=,comm= | awk '/VLC/ { print $1}'")
tell application "System Events" to repeat with i in lstNum
    set end of windowNames to name of first window of (first application process where unix id = i)
end repeat
return windowNames
 类似资料:
  • 考虑下面的Apple脚本: 问题:当我通过命令行实用程序运行此程序时,如果Safari没有运行,它就会启动,脚本报告“正在运行”。这不是我想要或期望的行为。请注意,当在苹果脚本编辑器中运行时,它按照期望/预期的方式工作。 这是一个已知的问题吗?还是出于某种原因而故意这样做?有人能让它按预期工作吗?(顺便说一句,我正在运行OSX 10.7.5;我不知道如何让报告版本号)。 如果您注释掉/行,它的行为

  • 我正在努力学习vue。因此,我制作了一个小应用程序,可以显示来自API的新闻文章,并在另一个视图中允许用户登录到另一台服务器。 为此,我使用Axios。我知道我在某个时候让它工作得很好,但是今天当我开始我的项目时,让两个API同时工作是不可能的。 这是我的登录服务: 这是我的新闻服务: 这两个服务都位于不同的JS文件中,并导入到不同的vue文件中,但现在它们似乎无法共存,并且总是有一个服务覆盖另一

  • 我想在Spring引导管理服务器中注册同一个应用程序的两个实例(只有端口不同)。但是我在我的Spring引导管理面板中只看到一个实例(MyApp实例2)。我的配置有什么问题? 基本信息: Spring Boot管理客户端-2.0.0-SNAPSHOT Spring Boot管理服务器-2.0.0-SNAPSHOT Spring Boot版本(两者)-2.0.1。发布 我的申请书。yml文件:

  • 问题内容: 背景 - 我正在尝试在单个Weblogic域的同一群集中以.war身份部署两个spring批处理应用程序,并且每个应用程序都在servlet.xml中配置了spring批处理管理控制台,如下所示- 它的一个maven项目和spring-batch-admin-manager 1.2.2被作为依赖项引入。 问题- 我正在努力使它们同时运行。目前,我无法让它们同时运行;当其中一个已经运行时

  • 问题内容: 事实 在我的Java应用程序中,我必须同时处理具有不同架构版本的XML文件(xsd文件)。XML文件的内容在不同版本之间仅发生了少许变化,因此我想主要使用相同的代码来处理它,并根据所使用架构的版本进行一些区分大小写的操作。 当前解决方案 现在,我正在使用SAX解析器解析XML文件,而我自己忽略了架构版本,只是检查是否存在需要处理的标签。 可能的选择 我真的很想使用JAXB生成用于解析X

  • 我想从我的应用程序在不同的社交应用程序中共享音频文件。我正在使用以下代码来共享音频。它适用于Whatsapp,但不适用于共享。共享应用程序打开但无法检索文件并显示“不支持发送此类内容”。该文件为“mp3”格式。我可以使用android通用共享选项从文件管理器共享文件,然后选择共享。