在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
相关产品推荐
相关产品推荐

