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

osascript比脚本编辑器慢得多

夏侯弘光
2023-03-14

首先,我承认我刚开始使用JXA(MacOS的Javascript自动化)做一个新项目,但对AppleScript没有太多了解。

目前,我正在尝试使用JXA运行以下命令:

Application("System Events").processes.windows.name()

首先,我使用脚本编辑器来运行它。它工作得很好,我很快就得到了输出。

但是,根据我的用例,因为我想经常从我的bash脚本中获得这段代码的输出,所以我尝试使用osascript执行它,如下所示

osascript -l JavaScript -e 'Application("System Events").processes.windows.name()' 

但这一次,在控制台中打印结果花了几秒钟。

现在我的问题是,为什么在osascript中执行同一个脚本要比脚本编辑器花费太多时间?有没有办法优化它的性能?

共有2个答案

伊羽
2023-03-14

这并不是你问题的答案,但你的JXA脚本有一个问题,那就是它正在引入所有进程(这可能是一个巨大的数字),而你可能只需要那些可视应用程序的进程。那么,让我们从这个开始。

这里是AppleScript来获取所有非空窗口名称的列表,在一行的CSV列表中,所有可见的应用程序:

tell application "System Events"
  set appList to (every application process whose background only is false)
  set winList2 to {}

  repeat with oApp in appList
    set winList to (name of every window in oApp whose name is not "")
    set winList2 to winList2 & (items of winList)
  end repeat

end tell

set AppleScript's text item delimiters to ","
set winListText to winList2 as text
return winListText

-->All Notes,Keyboard Maestro Editor,macos - osascript is very slower than Script Editor - Stack Overflow - Google Chrome - JMichael,Untitled 2.scpt,Untitled 2

转换为JXA应该不难,但如果您打算使用osascript在shell脚本中运行它,我认为转换为JXA没有什么好处。

我不知道您的工作流程的性质,但如果是我,我会将其作为已编译的脚本文件(.scpt)运行,并使用AppleScriptdo script(或JXAdoScript())命令执行bash脚本。

如果你使用了一种新的方法,速度也会更快。使用osascript命令创建scpt文件。

我将继续编写这个脚本,并将其转换为JXA,这是为了我自己的利益,如果不是为了你的利益。

我希望你觉得这有用。如果没有,也许别人会。

问题?

孙琨
2023-03-14

以下是JXA解决方案:

var winList = Application("System Events").processes.whose({backgroundOnly: {'=': false} }).windows.name();

var winList2 = winList.reduce(
  function(accumulator, currentValue) {
    return accumulator.concat(currentValue);
  },
  []
);
winList2 = winList2.filter(e => (e !== ""));
winList2.join(',')
 类似资料:
  • 脚本编辑器让你创建和编辑脚本,准备和运行已选择的脚本。拖放或双击右侧的“标识符”窗格的一个标识符来将它添加到编辑器中。 【提示】当你使用查找创建工具或聚合创建工具创建查询时,脚本将会在脚本编辑器中自动生成。 Navicat 提供广泛的高级功能,例如:编辑代码功能、智能自动完成代码、设置脚本格式及更多。 设置脚本格式 若要更改脚本格式,简单地从“格式”菜单选择 - 缩进 为已选择的代码行增加或减少缩

  • 脚本编辑器让你创建和编辑脚本,准备和运行已选择的脚本。拖放或双击右侧的“标识符”窗格的一个标识符来将它添加到编辑器中。 【提示】当你使用查找创建工具或聚合创建工具创建查询时,脚本将会在脚本编辑器中自动生成。 Navicat 提供广泛的高级功能,例如:编辑代码功能、智能自动完成代码、设置脚本格式及更多。 设置脚本格式 若要更改脚本格式,简单地从“格式”菜单选择 - 缩进 为已选择的代码行增加或减少缩

  • 脚本编辑器让你创建和编辑脚本,准备和运行已选择的脚本。拖放或双击右侧的“标识符”窗格的一个标识符来将它添加到编辑器中。 【提示】当你使用查找创建工具或聚合创建工具创建查询时,脚本将会在脚本编辑器中自动生成。 Navicat 提供广泛的高级功能,例如:编辑代码功能、智能自动完成代码、设置脚本格式及更多。 设置脚本格式 若要更改脚本格式,简单地从“格式”菜单选择 - 缩进 为已选择的代码行增加或减少缩

  • 我有运行一些Applescript的bash函数。如果我在Applescript编辑器或Textate中运行Applescript部分,它可以正常工作,但是在命令行上,函数失败了... 错误是: 我知道(认为)问题在于这一行的第一个bash转义序列: 但我不知道为什么失败了。。。你知道为什么这行不通吗? 编辑1:我也尝试过这个,但失败了: 错误消息:

  • 问题内容: 我想在两种情况下编辑Matlab脚本 (1)在Linux终端上运行的matlab命令窗口中,如何创建和编辑脚本文件?采用 将调用交互式编辑器,这在Linux服务器上运行时是不希望的。 (2)在emacs中,有什么方法可以方便地编辑matlab脚本?使用MATLAB-Emacs或EmacsLink哪个更好? 当我尝试从http://sourceforge.net/scm/?type=cv

  • 问题内容: 我想在python脚本中调用一个编辑器,以征询用户的输入,就像还是这样做。 这是我到目前为止所运行内容的摘录。(将来,我可能会使用$ EDITOR而不是vim,以便人们可以根据自己的喜好进行自定义。) 我的问题是,通过使用Popen,似乎使python脚本的I/O不能进入正在运行的vim副本中,而我找不到仅将I /O传递给vim的方法。我收到以下错误。 从python调用CLI程序,将