Как сгенерировать osascript с условием if else, которое можно запустить как NSApleScript

Пытаюсь запустить приложение и открыть в нем файл через applescript. Я смог сделать это из редактора сценариев Apple. Это эскрипто, которое я написал:

set AppPath to "<My App Path.app>"
tell application AppPath
    if it is running then
        activate
    else
        launch
    end if
    tell application AppPath to open POSIX file "<My File Path>"
end tell

Если приложение работало в фоновом режиме, один запуск не мог вывести его на передний план (над редактором сценариев). И если приложение не было запущено, активация не могла показать заставку. Поэтому я использовал запуск и активацию бота.

Скрипт работает нормально. Но мне нужен скрипт в моей программе на С++. Путь к приложению и путь к файлу будут определяться во время выполнения. Итак, я генерировал скрипт как NSApleScript и выполнял скрипт. И сгенерированный NSApplescript выглядит следующим образом:

do shell script "osascript -e 'set AppPath to \"<My App Path.app>\"' 
-e 'tell application AppPath' -e 'if it is running then' -e 'activate' 
-e 'else' -e 'launch' -e 'endif' 
-e 'tell application AppPath to open POSIX file \"<My File Path>\"'"

Весь приведенный выше код находится в одной строке, я разбил его для удобства чтения. Я получаю сообщение об ошибке variable e is not defined. Это не выполняется.

Код, который я использую для создания этого скрипта:

NSMutableString *script = [NSMutableString stringWithCapacity:512];
[script appendString:@"do shell script \"osascript "];
[script appendString:@"-e 'set AppPath to \\\""];
[script appendString:pathToApp];
[script appendString:@"\\\"'"];
[script appendString:@" -e 'tell application AppPath'"];
[script appendString:@" -e 'if it is running then'"];
[script appendString:@" -e 'activate'"];
[script appendString:@" -e 'else'"];
[script appendString:@" -e 'launch'"];
[script appendString:@" -e 'end if'"];
[script appendString:@" -e 'tell application AppPath to open POSIX file \\\""];
[script appendString:pathToFile];
[script appendString:@"\\\"'"];
[script appendString:@"\"\r"];

Я добавил пробелы перед -e, как предложил пользователь 309603. Теперь я получаю новую ошибку:

ошибка "266:266: синтаксическая ошибка: ожидаемый конец строки и т. д., но найден конец скрипта. (-2741)" номер 1


person sajas    schedule 28.04.2014    source источник
comment
Вы просто пропустили пробел перед каждой опцией -e.   -  person user309603    schedule 28.04.2014
comment
@user309603 user309603 Я добавил пробел перед -e, как вы предложили. Теперь я получаю новую ошибку о том, что найден конец скрипта. Я добавил код, который я использую для создания скрипта.   -  person sajas    schedule 29.04.2014


Ответы (2)


Блок сообщения должен быть закрыт в последней строке (как вы написали в редакторе AS).

[script appendString:@" -e 'end tell'"];

и, кстати, в предпоследней строке часть tell application AppPath to не нужна.

person user309603    schedule 29.04.2014
comment
Спасибо. проблема была решена, когда я поставил оператор «конец». Но я не получил вашего второго заявления. Если приложение по умолчанию для открытия файла является другим приложением, не должен ли я указать путь к приложению? - person sajas; 30.04.2014

Не используйте генерацию кода. Просто не надо. Если вы думаете, что вам нужна генерация кода, вы ошибаетесь. osascript и NSApleScript позволяют передавать параметры существующим сценариям AppleScript.

Для чего-то такого простого, как открытие файла, вам вообще не нужен AppleScript. Используйте NSWorkspace или LaunchServices.

person foo    schedule 29.04.2014
comment
Спасибо за ответ. Я пробовал с LaunchServices. Приложение не запускалось, оно запускалось и открывало файл корректно. Но он работал где-то в фоновом режиме, он просто открывал окно (без открытия файла) - person sajas; 30.04.2014