Ваше решение, вероятно, работает, но, возможно, то, что я придумал, может быть более работоспособным.
Из предложенных 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 является один «Исполняемый файл Unix» с именем recentItemsFinagler
вместо пакета приложений.
Чтобы использовать этот встроенный исполняемый файл в AppleScript, вам сначала нужно убедиться, что сценарий сохранен как пакет сценариев или приложение, а затем должен быть включен элемент панели инструментов Bundle Contents
, как показано на изображении ниже:
![введите здесь описание изображения](https://i.stack.imgur.com/YjKLc.png)
При нажатии на этот элемент панели инструментов отображается ящик, в котором отображается содержимое пакета сценариев или пакета приложений. Чтобы добавить свой собственный исполняемый файл, просто перетащите его из Finder, как показано на изображении ниже:
![введите здесь описание изображения](https://i.stack.imgur.com/ZZP8K.png)
Это скопирует его в пакет скриптов, как показано ниже:
![введите здесь описание изображения](https://i.stack.imgur.com/L4jRZ.png)
Чтобы найти этот исполняемый файл во время выполнения, вы можете использовать команду path to resource
AppleScript, которая является частью файла StandardAdditions.osax
. (Обратите внимание, что в зависимости от того, как вы пытаетесь использовать команду path to resource
в своем сценарии, вы можете столкнуться с ошибками «Ресурс не найден» при запуске сценария из редактора AppleScript, а не с помощью двойного щелчка по нему в диалоговом окне. Finder.Если вы столкнулись с ошибкой этого типа, сначала убедитесь, что вы сохранили все свои изменения в сценарии, затем выйдите из редактора AppleScript, затем запустите приложение сценария, дважды щелкнув его в Finder, после сценарий завершит выполнение, снова откройте редактор AppleScript, затем снова откройте приложение сценария, затем попробуйте запустить его из редактора AppleScript и посмотрите, работает ли он).
Итак, чтобы использовать этот 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 построчно, чтобы объяснить, что он делает. Сначала мы создаем глобальное свойство recentItemsFinagler
и устанавливаем его начальное значение missing value
. (missing value
— эквивалент AppleScript nil
в Objective-C).
Если вы не в курсе, глобальные свойства в AppleScript аналогичны глобальным переменным в других языках с одним важным дополнением: когда вы запускаете сценарий и присваиваете значение свойству, это значение фактически сохраняется в самом файле сценария, и сохранится до следующего запуска скрипта.
Сценарий сначала проверяет, равно ли recentItemsFinagler
missing value
, и, если это так, устанавливает его в результат (path to resource "recentItemsFinagler")
, который является ссылкой AppleScript alias
. Это похоже на псевдоним в Finder, поскольку он может успешно отслеживать такие изменения, как переименования и переходы из одной папки в другую. Если бы вместо этого я сохранил его как простую строку, а затем переместил этот пакет приложения AppleScript из папки «Документы» на рабочий стол, путь больше не был бы действительным, и свойство пришлось бы обновлять каждый раз при запуске сценария.
В любом случае, затем мы устанавливаем recentItemsString
на результат инструмента AppleScript do shell script
recentItemsFinagler
, который является строкой. Чтобы превратить это в список строк AppleScript, представляющих пути, вы используете команду paragraphs of
.
Таким образом, включив исполняемый файл в скрипт или пакет приложения AppleScript, вы можете получить желаемый результат менее чем за 10 строк кода.
Пример проекта: RecentItemsFinagler.zip
person
NSGod
schedule
04.01.2013
AppleScriptObjC
, приложением AppleScript Studio или просто простым AppleScript (созданным с помощью редактора AppleScript Editor), сохраненным как приложение? (Если вы используете Xcode и выбираетеNew Project > Application > Cocoa-AppleScript Application
, создается приложениеAppleScriptObjC
). - person NSGod   schedule 01.01.2013