あなたの解決策はおそらく機能しますが、おそらく私が思いついたものの方が実行可能かもしれません.
あなたが思いついた提案された 3 つのオプションのうち、実際にLSSharedFile*
コマンドが最良の解決策です。
AppleScript スクリプト バンドル (.scptd) と、アプリケーション バンドル (.app) として保存できるスクリプトの出現により、バンドル内にカスタム実行可能ファイルを非常に簡単に含めることができます。その結果、AppleScript だけやデフォルトの BSD サブシステム ツールだけでは達成できなかった場合でも、これらの実行可能ファイルを利用して必要なことを達成できます。
そこで、Xcode で、次のコードを使用する新しい「Foundation Tool」プロジェクトを作成しました。
int main(int argc, const char * argv[]) {
@autoreleasepool {
UInt32 resolveFlags = 0;
NSArray *arguments = [[NSProcessInfo processInfo] arguments];
if (arguments.count > 1) {
NSArray *revisedArguments = [arguments
subarrayWithRange:NSMakeRange(1, arguments.count - 1)];
for (NSString *arg in revisedArguments) {
if ([arg isEqualToString:@"--noUserInteraction"]) {
resolveFlags |= kLSSharedFileListNoUserInteraction;
} else if ([arg isEqualToString:@"--doNotMountVolumes"]) {
resolveFlags |= kLSSharedFileListDoNotMountVolumes;
}
}
}
LSSharedFileListRef sharedFileListRef = LSSharedFileListCreate(NULL,
kLSSharedFileListRecentDocumentItems, NULL);
NSArray *sharedFileListItemRefs =
(NSArray *)LSSharedFileListCopySnapshot(sharedFileListRef, NULL);
for (id itemRef in sharedFileListItemRefs) {
NSURL *resolvedURL = nil;
LSSharedFileListItemResolve((LSSharedFileListItemRef)itemRef,
resolveFlags, (CFURLRef *)&resolvedURL, NULL);
if (resolvedURL) {
printf("%s\n", resolvedURL.path.fileSystemRepresentation);
[resolvedURL release];
}
}
if (sharedFileListRef) CFRelease(sharedFileListRef);
[sharedFileListItemRefs release];
return EXIT_SUCCESS;
}
}
このコードはあなたのコードと似ていますが、結果を中間ファイルに書き込む代わりに、ファイル パスを標準出力に出力するだけです。これにより、AppleScript 側でのコーディングが大幅に簡素化されるはずです。この Xcode プロジェクトをビルドrecentItemsFinagler
すると、アプリケーション バンドルの代わりに名前が付けられた単一の「Unix 実行可能ファイル」が作成されます。
このビルドされた実行可能ファイルを AppleScript で利用するには、まずスクリプトがスクリプト バンドルまたはアプリケーションとして保存されていることを確認してから、Bundle Contents
下の画像のようにツールバー項目を有効にする必要があります。
そのツールバー項目をクリックすると、スクリプト バンドルまたはアプリケーション バンドルの内容を示す引き出しが表示されます。カスタム実行可能ファイルを追加するには、下の画像のように Finder からドラッグ アンド ドロップするだけです。
これにより、次のようにスクリプト バンドルにコピーされます。
実行時にこの実行可能ファイルを見つけるpath to resource
には、 の一部である AppleScript コマンドを使用できますStandardAdditions.osax
。path to resource
(スクリプトでコマンドを使用する方法によっては、Finder でスクリプトをダブルクリックして実行するのではなく、AppleScript エディタ内からスクリプトを実行すると、「リソースが見つかりません」というエラーが発生する場合があることに注意してください。このタイプのエラーが発生した場合は、まずスクリプトへのすべての変更を保存したことを確認してから、AppleScript エディタを終了し、Finder でスクリプト アプリケーションをダブルクリックして起動します。実行を終了し、AppleScript Editor を再度開いてから、スクリプト アプリケーションを再度開いてから、AppleScript Editor 内から実行してみて、動作するかどうかを確認してください)。
したがって、これrecentItemsFinagler
を AppleScript で利用するには、次のようにします。
property recentItemsFinagler : missing value
if (recentItemsFinagler = missing value) then
set recentItemsFinagler to (path to resource "recentItemsFinagler")
end if
set toolPath to quoted form of POSIX path of recentItemsFinagler
set recentItemsString to (do shell script toolPath & " --noUserInteraction --doNotMountVolumes")
set recentItemsPaths to paragraphs of recentItemsString
この AppleScript を 1 行ずつ調べて、何をしているのかを説明します。最初にグローバル プロパティを作成し、recentItemsFinagler
その初期値を に設定しますmissing value
。(missing value
は、Objective-C に相当する AppleScript ですnil
)。
ご存じないかもしれませんが、AppleScript のグローバル プロパティは他の言語のグローバル変数に似ていますが、重要な点が 1 つあります。スクリプトを実行してプロパティに値を割り当てると、その値は実際にはスクリプト ファイル自体に保存されます。次回スクリプトを実行するまで保持されます。
スクリプトは最初に が と等しいかどうかを確認し、recentItemsFinagler
等しい場合はAppleScript参照であるmissing value
の結果に設定します。これは、名前の変更や、あるフォルダーから別のフォルダーへの移動などの変更を正常に追跡できるという点で、Finder のエイリアスに似ています。代わりに単純な文字列として保存し、この AppleScript アプリケーション バンドルをドキュメント フォルダからデスクトップに移動した場合、パスは無効になり、スクリプトが実行されるたびにプロパティを更新する必要があります。(path to resource "recentItemsFinagler")
alias
とにかく、文字列であるrecentItemsString
AppleScriptdo shell script
recentItemsFinagler
ツールの結果に設定します。これを、パスを表す文字列の AppleScript リストに変換するには、次のparagraphs of
コマンドを使用します。
したがって、スクリプトまたは AppleScript アプリケーションのバンドル内に実行可能ファイルを含めることで、10 行未満のコードで目的の結果を得ることができます。
サンプル プロジェクト: RecentItemsFinagler.zip