gpt4 book ai didi

javascript - 如何使用 osascript 获取 JavaScript 中的服务列表?

转载 作者:行者123 更新时间:2023-11-28 07:49:25 25 4
gpt4 key购买 nike

我一直在尝试创建一个脚本来生成所有可用服务名称的 XML 结构。它在脚本编辑器中运行良好,但无法从命令行运行。我的代码是:

ObjC.import("Cocoa");
ObjC.import("AppKit");


function run(arg) {
items = $.NSApp.servicesMenu.itemArray;

list = "<items>";
count = 0;
items.enumerateObjectsUsingBlock(function( obj, index, stop ){
list += "<item uid='Service" + count + "' arg='" + obj.title.UTF8String + "' valid='yes' autocomplete='" + obj.title.UTF8String + "'><title>" + obj.title.UTF8String + "</title><subtitle>Services Toolbox</subtitle><icon>icon.png</icon></item>";
count++;
});

list += "</items>";

return list;
}

此代码将在 Alfred 工作流程中使用。关于如何改变它有什么想法吗?

据我所知,在 osascript 解释器中运行它没有服务菜单,但脚本编辑器有。我怎样才能绕过这个问题来获取服务列表?

最佳答案

你是对的,由于脚本是通过 osascript 启动的,$.NSApp 将无法访问服务菜单。

但是,通过一些 UI 脚本,您可以通过查找器应用程序找到所有菜单项:

function grabFirstNested(arr) {
if (arr.length <= 0 || !Array.isArray(arr[0])) {
return arr;
}

return grabFirstNested(arr[0]);
}

function run(arg) {

var sys = Application('System Events');

var servicesRef = sys.processes['Finder'].menuBars.menuBarItems.whose({
name: { _contains: 'finder'}
}, {ignorign: 'case'}).menus.menuItems.whose({
name: { _contains: 'services'}
}, {ignoring: 'case'}).menus.menuItems.name;

var services = grabFirstNested(servicesRef());
var list = "<items>";
services.forEach(function(service, index) {
list += "<item uid='Service" + index + "' arg='" + service + "' valid='yes' autocomplete='" + service + "'><title>" + service + "</title><subtitle>Services Toolbox</subtitle><icon>icon.png</icon></item>";
});
list += "</items>";

return list;
}

此脚本将通过系统事件 API 访问 Finder 应用程序,从而可以访问用于编写脚本的 UI 元素。一旦有了 Finder 应用程序,它就会从“services”菜单栏项中获取 MenuItems

关于javascript - 如何使用 osascript 获取 JavaScript 中的服务列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27032078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com