0%

macOS 自动化, AppleScript / JXA

一些 macOS 平台上使用 jxa 的实践

AppleScript & JavaScript

  • osascript 用于执行自动化脚本
  • osascript -l JavaScript demo.js 执行 js

jxa + Node.js

jxa 即 JavaScript for Automation, 生态有

  • @jxa/run 可以 stringify js function, 并使用 osascript 执行
  • @jxa/types 提供自带 App 的类型, 如 (Finder, Mail 等

工具

  • @jxa/global-type 提供 AppleScript 全局变量定义, 如 Application
  • @jxa/sdef-to-dts.sdef 定义文件转换成 .d.ts 文件

其他

  • jxa-common-used 提供了常用的 Path Finder / Google Chrome / iTerm2 的定义

npm mac-helper

npm version
npm downloads

基于 jxa-common-used & @jxa/run 对常用 App 进行封装

Finder & Path Finder

API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
export async function getPathFinderSelected() {
const filePaths: string[] = await jxaRun(() => {
const app = Application<PathFinderType>('Path Finder')
return (app.selection() || []).map((x) => x.posixPath())
})
return filePaths
}

export async function getFinderSelected() {
const urls: string[] = await jxaRun(() => {
const app = Application('Finder')
const selection = app.selection()
return (selection || []).map((x) => x.url())
})
return urls.map((u) => fileURLToPath(u))
}

AppleScript 版本

1
2
3
tell application "Path Finder"
get POSIX path of (get item 1 of (get selection))
end tell

shell function

1
2
3
4
5
6
7
export APPLE_SCRIPT_HOME="$MY_ZSH_HOME/applescript"

# path finder
function pf(){
f=`osascript $APPLE_SCRIPT_HOME/path-finder-selected.applescript`
echo "$f"
}

这样可以在命令行中使用的时候, 使用 pf 获取 PathFinder 中选择的文件

CLI app

CLI app 中可以使用约定, 如 $PF 字符串, 如果 input 为约定字符串, 则使用 PathFinder.allSelected() 获取选择, 并替换 input 为实际选中.

Platypus

Platypus 可以将命令行封装成 GUI app 执行, 如果输入是文件路径, 且其他参数可以固定, 可以使用上述约定 $PF + PathFinder 选择路径等程序读取的方法.

例如 https://www.npmjs.com/package/handy-img 可以压缩图片

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set -x

args=(
--app-icon '/Applications/Platypus.app/Contents/Resources/PlatypusAppIcon.icns'
--interface-type 'Text Window' --text-font 'Jetbrains Mono 16'
--author 'magicdawn'
--interpreter '/bin/zsh'
--optimize-nib
--overwrite
)

APPDIR="$HOME/RaycastApplications/Platypus"

platypus "${args[@]}" \
--name "pl Handy Img Compress" \
--interpreter-args $'-c|set -x; himg c -d \'$PF\' -q 85 --other-files move -y' \
"$(dirname "$0")/default.sh" "$APPDIR/pl himg compress.app"
  • default.sh 内容为空, 真正的命令是使用 zsh -c '<cmd>' 里的
  • handy-img 包能够处理 -d '$PF' 的情况
  • 选中文件夹后, 使用 raycast 打开这个 app, 就能执行预设的命令