AppleScript — как заставить действия игнорировать инструкции tell, в которые они вложены?

#user-interface #applescript #script

Вопрос:

Я думаю, что я использую ignoring application responses неправильно.

Что я хотел бы сделать, так это иметь вложенные действия, которые не зависят от сценариев приложений, в которые они вложены.

В приведенном ниже примере есть цикл повтора, который зависит от application "System Events" и application process myApp и т. Д. Но какие бы действия ни происходили в этом цикле, я бы хотел , чтобы они игнорировались application "System Events" и application process myApp т. Д. Как мне этого добиться?

 set myApp to "someApp" set pPath to POSIX file "/Volumes/myDisk/outputPath"  tell application myApp to activate  tell application "System Events"  tell application process myApp  tell window myApp   --some code here   repeat while progress indicator 1 of sheet 1 exists  ignoring application responses  set newPath to POSIX file pPath as alias  set currentDate to current date  end ignoring  end repeat   --some code here   end tell  end tell end tell  

Возвращаемая ошибка:

 get POSIX file (file "myDisk:outputPath:") of application process "somApp" Result: error "No result was returned from some part of this expression."  

Здесь я бы ожидал get POSIX file (file "myDisk:outputPath:") of application process "somApp" , что просто буду get POSIX file (file "myDisk:outputPath:") .

Ответ №1:

pPath уже есть POSIX file , удалите POSIX file

 set newPath to pPath as alias  

В этом случае с путями HFS все проще

 set hPath to "myDisk:outputPath"  ...  set newPath to alias hPath   

Комментарии:

1. Да, ты прав, я думаю, что я перепутал там несколько проблем. Но я не могу найти ни одного ресурса по своей проблеме. Как я могу игнорировать tell application "System Events" (и вложенные сообщения), когда у меня есть действия, вложенные в эти инструкции tell, но не связанные с ними?

2. Вы можете использовать tell me или поместить несвязанный код в отдельный обработчик.

Ответ №2:

Все зависит от того, кому принадлежит команда. Зная, кому принадлежит команда, вы можете перенаправить ее в нужное приложение (или в фреймворки) с помощью вложенного предложения tell. Например, здесь я пытаюсь перенаправить команду (текущая дата) в рамки установленных дополнений скрипта.

 set myApp to "someApp" set pPath to POSIX file "/Volumes/myDisk/outputPath" set newPath to pPath as alias  tell application myApp to activate  tell application "System Events" to tell process myApp to tell window 1    --some code here    repeat while progress indicator 1 of sheet 1 exists  tell scripting additions to set currentDate to current date  end repeat    --some code here   end tell  

Но это не всегда поможет. Правильное и стабильное решение состоит в том, чтобы «отделить» вложенные блоки tell и преобразовать их в отдельные блоки tell. В вашем примере я бы сделал это так:

 set myApp to "someApp" set pPath to POSIX file "/Volumes/myDisk/outputPath" set newPath to pPath as alias  tell application myApp to activate tell application "System Events" to tell process myApp to tell window 1  --some code here end tell  set indicatorExists to true repeat while indicatorExists  tell application "System Events" to tell process myApp to tell window 1  set indicatorExists to progress indicator 1 of sheet 1 exists  end tell  set currentDate to current date -- now this command is not nested end repeat  tell application "System Events" to tell process myApp to tell window 1  --some code here end tell  

Комментарии:

1. Отлично, теперь я понял: перенаправление или отдельные блоки. В большинстве случаев разделение работает, но я перенаправил цикл в зависимости от рассматриваемого блока tell. Спасибо!