新しいOSのベータ版や、古いOS環境のAppleScript用語辞書をまとめて取り出すために作成したAppleScriptです。
アプリケーションのバンドル内から直接sdefを取り出すと、他の要素を外部からincludeしているsdefでは「完全体」にならない(資料として価値がなくなる)ため、Script Editorで表示(レンダリング)させた状態のものをコピーするよう処理しています。
以前にもこうした種類のScriptを書いていたような気もするのですが、どこかに行ってしまいました。
macOSのバージョン、ビルドNo.などを取得し、コピーしたSDEFファイルに対象アプリのバージョン番号ともども記載するようにしています。
本Scriptはスクリプトエディタを操作するものであるため、Script Debuggerなどの他の実行プログラムから実行することが望ましいところです。
そして、macOS 15.0beta2でもScript Debuggerが起動しないため、肝心のmacOS 15Betaでsdef書き出しを自動化できていないという………
AppleScript名:指定Bundle IDのアプリのsdefを指定フォルダに取り出す.scpt |
— – Created by: Takaaki Naganoya – Created on: 2024/06/27 — – Copyright © 2024 Piyomaru Software, All Rights Reserved — use AppleScript use scripting additions use framework "Foundation" use framework "AppKit" set aList to {"com.apple.iCal", "com.apple.AddressBook", "com.apple.databaseevents", "com.apple.finder", "com.apple.imageevents", "com.apple.mail", "com.apple.MobileSMS", "com.apple.Music", "com.apple.Notes", "com.apple.Photos", "com.apple.QuickTimePlayerX", "com.apple.reminders", "com.apple.Safari", "com.apple.ScriptEditor2", "com.apple.speech.SpeechRecognitionServer", "com.apple.systemevents", "com.apple.Terminal", "com.apple.TextEdit", "com.apple.TV", "com.apple.systempreferences"} set targFol to POSIX path of (choose folder with prompt "SDEF収集先フォルダを選択") –Get OS Version and Build Number set sDic to current application’s NSDictionary’s dictionaryWithContentsOfFile:"/System/Library/CoreServices/SystemVersion.plist" set osV to (sDic’s objectForKey:"ProductVersion") as string set bNo to (sDic’s objectForKey:"ProductBuildVersion") as string –Loop by Bundle IDs repeat with i in aList set j to contents of i set aRes to retPathFromBundleID(j) of me set appAlias to (POSIX file aRes) as alias set vRes to gepAppVersionByID(j) of me tell application "Script Editor" open appAlias –Open App –> SDEF will be displayed tell front document set docPath to path of it end tell end tell do shell script "sync" –Important!!!! set aP1 to (current application’s NSString’s stringWithString:(docPath as string)) set theName to aP1’s lastPathComponent() set aP2 to (current application’s NSString’s stringWithString:targFol) set newPath to (aP2’s stringByAppendingPathComponent:theName) set aExt to (newPath’s pathExtension()) as string set newPath to (newPath’s stringByDeletingPathExtension() as string) & "_v" & vRes & "@" & osV & "(" & bNo & ")." & aExt –Copy SDEF file set aRes to (my copyFileAt:aP1 toFilePath:newPath) –Close SDEF tell application "Script Editor" tell front document close without saving end tell end tell end repeat –バンドルIDからApp Fileのパスを求める on retPathFromBundleID(aBundleID) set aURL to current application’s NSWorkspace’s sharedWorkspace()’s URLForApplicationWithBundleIdentifier:aBundleID if aURL = missing value then return false –Error return aURL’s |path|() as string end retPathFromBundleID –ファイルのコピー on copyFileAt:origPOSIXPath toFilePath:newPOSIXPath set POSIXPath1 to current application’s NSString’s stringWithString:origPOSIXPath set POSIXPath2 to current application’s NSString’s stringWithString:newPOSIXPath set fileManager to current application’s NSFileManager’s defaultManager() set theResult to fileManager’s copyItemAtPath:POSIXPath1 toPath:POSIXPath2 |error|:(missing value) return (theResult as integer = 1) end copyFileAt:toFilePath: –バンドルIDで指定したアプリケーションのバージョン番号を文字列で取得する on gepAppVersionByID(aBundleID) set aURL to current application’s NSWorkspace’s sharedWorkspace()’s URLForApplicationWithBundleIdentifier:aBundleID set theResult to {} set theNSBundle to (current application’s NSBundle’s bundleWithURL:aURL) if aURL is not missing value then set theVersionString to ((theNSBundle’s infoDictionary())’s objectForKey:"CFBundleShortVersionString") if theVersionString is not missing value then return theVersionString as string end if end if return "" end gepAppVersionByID |