You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在macOS的JavaScript for Automation(JXA)中如何获取当前脚本自身的路径?(等效于AppleScript的path to me)

在JXA中获取脚本包(.scptd)自身路径的解决方案

我完全懂你的困扰——想用JXA实现AppleScript里path to me的功能,结果app.pathTo(this)拿到的却是Script Editor的路径,根本没法引用脚本包里的资源。别着急,我来给你一个靠谱的解决方案。

可行的实现代码

首先直接上能拿到脚本包自身路径的代码:

// 获取当前JXA脚本包的完整路径
function getPathToMe() {
    const app = Application.currentApplication();
    app.includeStandardAdditions = true;
    // 利用NSBundle特性获取脚本包路径(.scptd本质是一个OS X bundle)
    const bundle = $.NSBundle.bundleWithURL($.NSURL.fileURLWithPath(app.pathTo('current application')));
    const bundlePath = bundle.bundlePath.js;
    // 转换为JXA的Path对象格式(也可以直接用字符串形式的POSIX路径)
    return Path(bundlePath).toString();
}

// 调用示例
const myScriptBundlePath = getPathToMe();
console.log('我的脚本包路径:', myScriptBundlePath);

为什么之前的方法失效?

你之前用app.pathTo(this)的时候,JXA里的this上下文指向的是当前激活的Application对象(也就是你用来运行脚本的Script Editor),而不是你的.scptd脚本文件本身。这和AppleScript里me直接指代脚本自身的逻辑完全不同,所以才会拿到编辑器的路径。

拓展:引用脚本包内的资源

既然你需要调用脚本包里的额外资源,这里给你加个实用的示例,比如获取Contents/Resources文件夹下的文件:

// 获取脚本包内Resources目录下指定资源的路径
function getScriptResourcePath(resourceFileName) {
    const scriptBundlePath = getPathToMe();
    return `${scriptBundlePath}/Contents/Resources/${resourceFileName}`;
}

// 示例:获取Resources里的icon.icns文件路径
const iconPath = getScriptResourcePath('icon.icns');
console.log('资源文件路径:', iconPath);

注意事项

  • 这个方法仅在脚本保存为.scptd脚本包(或者.app格式的脚本应用)时生效,如果是在Script Editor里直接运行未保存的脚本,拿到的还是编辑器的路径。
  • 测试时记得把脚本保存为.scptd,然后直接双击运行,或者从Script Editor里打开这个包文件再运行,不要用临时的未保存脚本测试。

内容的提问来源于stack exchange,提问作者adib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:37:28