gpt4 book ai didi

macos - 通过 ScriptMonitor.app 实用程序运行 AppleScript

转载 作者:行者123 更新时间:2023-12-03 09:15:23 26 4
gpt4 key购买 nike

当 AppleScript 通过系统范围的脚本菜单运行时,其进度会使用 ScriptMonitor 小程序(位于 /System/Library/CoreServices/ScriptMonitor.app 中介绍)显示在菜单栏中OS X 优胜美地)。这使您可以了解正在运行的脚本、监控进度并轻松停止正在运行的脚本。

ScriptMonitor Icon

是否可以通过 ScriptMonitor 从脚本菜单外部运行 AppleScript,例如从终端或从其他应用程序的系统调用?

我尝试了以下命令的各种排列,但都没有成功:

/System/Library/CoreServices/ScriptMonitor.app/Contents/MacOS/ScriptMonitor /PATH/TO/SCRIPT

open -a /System/Library/CoreServices/ScriptMonitor.app --args /PATH/TO/SCRIPT

这很有用的原因是,有许多帮助程序应用程序运行 AppleScript 来响应事件,但往往不太擅长通知用户其成功或失败。

最佳答案

事实证明,这可以使用 Cocoa 框架中的 NSUserScriptTask 来完成,既可以作为已编译的命令行应用程序的一部分,也可以通过 AppleScript/Objective-C (ASObjC) 来完成。

此解决方案允许从 System ScriptMonitor.app 实用程序运行 AppleScript、Automator 工作流程和 shell 脚本。


ASObjC 解决方案

此处理程序将在 OS X 10.10 Yosemite 及更高版本上 native 运行。它采用单个参数,即包含脚本的 POSIX 样式(斜杠分隔)路径的字符串。脚本在后台立即执行,不返回结果。

use framework "Foundation"

to runInScriptMonitor(script_path)

set {script_task, url_error} to current application's NSUserScriptTask's alloc()'s initWithURL:(script_path as POSIX file) |error|:(reference)
if url_error is not missing value then error (url_error's localizedDescription as string) number (url_error's code as integer)
script_task's executeWithCompletionHandler:(missing value)

# The following delay was increased due to a system hang on Mojave after installation of Security Update 2020-004 (previously, the delay was 0.05).
delay 10 -- Necessary to allow NSUserScriptTask to be dispatched before execution terminates.

return

end runInScriptMonitor

调用方式如下:runInScriptMonitor("/PATH/TO/FILE")

这允许您从 AppleScript 中运行 ScriptMonitor 中的脚本。如果调用位于包装器 AppleScript 中,则可以使用 osascript 从命令行调用包装器脚本。


编译的 Objective-C 解决方案

按照这些说明创建一个命令行程序,该程序将脚本路径作为输入并使用 ScriptMonitor 运行脚本。您必须安装Xcode命令行工具(或完整的Xcode)才能编译代码。

  1. 将以下代码保存为桌面文件夹中的 osascriptmonitor.m:

     #import <Foundation/Foundation.h>

    int main(int argc, const char *argv[]) {
    if (argc < 2) {
    printf("usage: osascriptmonitor /path/to/script\n");

    } else {
    NSString *script_path = [NSString stringWithUTF8String:argv[1]];
    NSUserScriptTask *script_task = [[NSUserScriptTask alloc] initWithURL:[NSURL fileURLWithPath:script_path] error:nil];
    [script_task executeWithCompletionHandler:nil];
    [NSThread sleepForTimeInterval:60.0f];
    }

    return 0;
    }
  2. 通过从终端运行以下命令来编译程序:

     cd ~/Desktop
    gcc -framework Foundation osascriptmonitor.m -o osascriptmonitor
  3. 您的桌面上现在将有一个名为 osascriptmonitor 的可执行文件。您可以从终端运行该程序,并传递要在 ScriptMonitor 中运行的脚本的路径。

示例(将 /PATH/TO/SCRIPT 替换为您要运行的脚本的路径):

    ~/Desktop/osascriptmonitor "/PATH/TO/SCRIPT"

如果您随后将可执行文件移至 /usr/local/bin,则无需指定其完整路径即可运行该程序。

    osascriptmonitor "/PATH/TO/SCRIPT"

2020 年 1 月 3 日编辑:

直接解决方案

一次偶然的机会,我偶然发现了 osascript 的一个未记录的选项,这使得上述内容对于 AppleScripts 来说基本上是不必要的:-P 开关。

用法:osascript -P "/PATH/TO/SCRIPT"

仅当脚本监视器已在运行时,这才会使脚本出现在菜单中。脚本监视器可以提前(或在脚本运行时)启动,并在所有脚本完成后自动退出。

启动脚本监视器的最佳方法是使用 -g 选项:

open -g /System/Library/CoreServices/ScriptMonitor.app

使用此方法,除了让脚本出现在脚本监视器中之外,还可以轻松地将参数传递给脚本。

关于macos - 通过 ScriptMonitor.app 实用程序运行 AppleScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34081057/

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