jxa快速入門,Javascript已加入AppleScript全家桶

来源:https://www.cnblogs.com/andrewwang/archive/2018/03/09/8536446.html
-Advertisement-
Play Games

因為工作環境基本是以跨平臺為主,所以純mac本地化的AppleScript一直關註是不夠的,前幾天找資料發現AppleScript也在迅速的進步著,目前已經對Javascript做了比較好的支持 當然早就支持,現在只是感覺上更好了。這項技術的全稱是JavaScript for Automation, ...


因為工作環境基本是以跨平臺為主,所以純mac本地化的AppleScript一直關註是不夠的,前幾天找資料發現AppleScript也在迅速的進步著,目前已經對Javascript做了比較好的支持------當然早就支持,現在只是感覺上更好了。這項技術的全稱是JavaScript for Automation,算一項比較新的技術,簡稱JXA。
本博不是學術研究性的,因此完全從實用出發,力求給出自己的實用性見解而不是長篇大論引用官方文字。這裡給出我總結的幾個特點:

  • 脫離腳本編輯器Script Editor運行更順暢,支持也更好,不再出現原來的一些莫名其妙問題。
  • 支持Object C對象的嵌入,並以其為橋梁調用c的函數。
  • 支持腳本庫,除了自己寫腳本庫,還可以使用node.js的腳本。
  • 運行的速度很快,對mac下的各個應用支持良好,定製起來很順手。

先介紹幾個資源:
OSX ReleaseNotes:https://developer.apple.com/library/content/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/Articles/Introduction.html
AppleScript的官方參考手冊:https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html#//apple_ref/doc/uid/TP40000983-CH208-SW1
寫的很詳細的一本入門手冊:https://github.com/JXA-Cookbook/JXA-Cookbook/wiki/Foreword,本文很多樣例代碼來自於此。

使用方法,我們這裡拋棄mac內置的腳本編輯器,如同我們熟悉的其它類型js腳本一樣來使用。首先介紹適合初學者練慣用的命令行互動式運行環境,也叫REPL (read-eval-print-loop):

osascript -il JavaScript

在交互環境中,首先獲取當前運行的app,然後運行附加腳本執行,幾乎所有的腳本都先要執行這兩句來獲取腳本運行的環境:

>> var app = Application.currentApplication()           //這是獲取當前運行的app
=> undefined        //交互環境的返回值,這裡先不用管
>> app.includeStandardAdditions = true      //打開允許運行腳本
=> true

然後比如我們彈出一個警告框:

app.displayAlert('wow', { message: 'I like JavaScript' })

回車後會立即執行,你可以看到mac屏幕上彈出的gui對話框。
接下來,如果連在一起,成為一個腳本文件,應當是這個樣子:

#!/usr/bin/env osascript -l JavaScript

var app = Application.currentApplication()
app.includeStandardAdditions = true
app.displayAlert('wow', { message: 'I like JavaScript' });

把上面的代碼保存為一個文件,比如叫testAlert.js,第一句可能是唯一需要解釋的,#!開頭表示是腳本標誌,後面的是腳本解釋器的路徑,在這裡是/usr/bin/env osascript -l JavaScript,/usr/bin/env的意思是在環境參量中尋找後面的osascript命令來執行,再後面則是執行參數。
保存為文本文件之後,chmod +x testAlert.js,隨後./testAlert.js就可以執行了。效果跟互動式環境運行是相同的。

通過Objc調用c語言庫函數的例子:

#!/usr/bin/env osascript -l JavaScript
//引用c的函數庫
ObjC.import('stdlib')
//這樣引用的函數,都在$.這個域下麵
function run(argv) {    //似乎相當於main函數,是自動啟動的
  argc = argv.length // If you want to iterate through each arg.

  status = $.system(argv.join(" "))        //相當於c的system(...)
    //這裡實際是把所有的參數當做參數來執行一個system調用
  $.exit(status >> 8)   //使用c函數exit來退出程式並給出返回值
}

引用函數庫,預設情況下,系統可以從三個位置搜索函數庫:

  • ~/Library/Script Libraries/
  • 一個macos app包的Contents/Library/Script Libraries/路徑。(這個從OSX10.11開始支持)
  • 從環境參量OSA_LIBRARY_PATH中尋找,多個路徑跟PATH一樣,中間用“:”隔開。(這個也是從OSX10.11)開始支持。

首先假設我們寫了一個庫函數:

function log(message) {
    TextEdit = Application('TextEdit')
    doc = TextEdit.documents['Log.rtf']
    doc.text = message
}

功能很簡單,就是利用系統的文本編輯器將輸出信息保存為一個rtf文件。以上代碼保存為文件名為toolbox.scpt的文本文件,記住腳本庫文件必須用.scpt尾碼。這個庫文件我們放到~/Library/Script Libraries/路徑下。隨後可以在REPL環境下測試使用這個庫文件:

toolbox = Library('toolbox')
toolbox.log('Hello world')

這個方法是官方推薦的校本庫編寫和調用方法,實際上我們還可以用類似node.js方法,這種方法首先要自己寫一個基本的引入函數:

var require = function (path) {
  if (typeof app === 'undefined') {
    app = Application.currentApplication();
    app.includeStandardAdditions = true;
  }

  var handle = app.openForAccess(path);
  var contents = app.read(handle);
  app.closeAccess(path);

  var module = {exports: {}};
  var exports = module.exports;
  eval(contents);

  return module.exports;
};

然後程式中就可以使用類似這樣的方法來調用庫函數:

app=require('node_modules/jxapp/index.js')
app.displayAlert("text")

這個例子僅供示例,並沒有實際作用,因為上面的require函數中實際上我們已經得到了app的實例。使用node.js的庫函數的時候有兩個註意事項:

  • jxa實際並非在瀏覽器環境運行的,這一點很類似node.js的伺服器端,所以要註意global和window兩個預置的變數是不存在的,可以在程式一開始設定window=this;global=this;來規避庫內部的調用。這個問題其實前幾天我們說AngularJS2的時候也提到了。
  • 調用node.js庫,目前主要還是使用Browserify來實現的,所以要提前使用安裝相關包:

    npm install -g browserify   
    npm install coffeeify lodash  coffeescript

    具體的使用方法可以參考上面資源鏈接中的例子,這裡就不展開了。

作為mac電腦上最犀利的自動化工具,如果不想大動干戈用Xcode寫ObjectC或者Swift的話,jxa腳本還是非常值得推薦的技術手段,如果一直在mac環境生存的話,建議及早試吃。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 新開了一個多線程編程系列,該系列主要講解C#中的多線程編程。 利用多線程的目的有2個: 一是防止UI線程被耗時的程式占用,導致界面卡頓;二是能夠利用多核CPU的資源,提高運行效率。 我沒有進行很深入的講解,是以實際使用為主。我的這個系列主要是《CLR via C#》的總結,該書的作者Jeffrey ...
  • 實例產品基於asp.net mvc 5.0框架,源碼下載地址:http://www.jinhusns.com/Products/Download 在.net框架中,事件是將事件發送者(觸發事件的對象)與事件接受者(處理事件的方法)相關聯的一種代理類,即事件機制是通過代理類來實現的。當一個事件被觸發時 ...
  • 在Word文檔中,我們可以通過添加頁眉、頁腳的方式來豐富文檔內容。添加頁眉、頁腳時,可以添加時間、日期、文檔標題,文檔引用信息、頁碼、內容解釋、圖片/LOGO等多種圖文信息。同時也可根據需要調整文字或圖片在頁眉頁腳的位置。因此,本文將介紹如何在C#中使用免費組件Free Spire. Doc for ...
  • 我寫了一個Asp.net core mvc項目,但是部署在iis發生了502.5的問題一直解決不了。 環境 系統:最強Win10; 工具:輕巧VS Code; 各種百度bing都沒有我要的解決方案,說的都是 1. 保證電腦上有.net core sdk或者.net core runtime; 2. ...
  • 本示例描述瞭如何創建一個WCF服務,並宿主在命令行應用程式中,客戶端可以訪問服務元數據,並以非同步的方式消費它。 首先,我們創建了一個WCF服務。關於如何創建WCF服務,可以參考我之前的文章(WCF學習之旅—第三個示例之一(二十七)至WCF學習之旅—第三個示例之五(三十一)) ...
  • Zabbix是什麼 Zabbix 是由Alexei Vladishev創建,目前由Zabbix SIA在持續開發和支持。 Zabbix 是一個企業級的分散式開源監控方案。 Zabbix是一款能夠監控各種網路參數以及伺服器健康性和完整性的軟體。Zabbix使用靈活的通知機制,允許用戶為幾乎任何事件配置 ...
  • 昨天遇到個問題,我的Ubuntu各種更新不上去,在系統設置裡面做了很多調整,仍然沒辦法更新。 如果你也是這樣的,希望下麵的操作能幫助你。 sudo apt-get update && sudo apt-get upgrade sudo vim /etc/update-manager/release- ...
  • 1 .Ubuntu所在的分區,也就是/dev/sda的那個盤(如果想直觀看到,請在Ubuntu的應用市場裡面搜索gparted,好評最多的那個就是,安裝好了以後,點super/win鍵,搜索gparted就出來了,看下圖),一定安裝到SSD硬碟裡面,因為這樣速度快很多很多,之後準備HDD硬碟存放數據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...