2016-09-03 3 views
0

Я новичок в Applescript и написал сценарий для безопасного удаления файлов, в результате чего открывается диалоговое окно выбора файла и подтверждения, а затем вытирает файл. Однако, когда я пытался добавить функции перетаскивания, он не работает, как все говорят, что это должно. Значок никогда не выделяется (указывает, что перетаскивание работает), а Finder просто копирует файл в папку приложения, а не перетаскивает его в приложение!Applescript drag and drop не работает

Вот оригинальный сценарий, который работает отлично (сохранить как «Wipe File.app»):

on run 
    set the_file to choose file with prompt "Select the file to wipe:" 
    wipe_file(the_file) 
end run 

to wipe_file(file_to_wipe) 
    set file_to_wipe to POSIX path of file_to_wipe 
    set ok_to_wipe to display dialog "Are you sure you want to wipe \"" & file_to_wipe & "\"?" buttons {"Cancel", "OK"} default button "Cancel" 
    set ok_to_wipe to button returned of ok_to_wipe 
    if (ok_to_wipe = "OK") then 
     tell application "Terminal" 
      activate 
      do script "set prompt='';cls;srm -v \"" & file_to_wipe & "\"" 
      delay 3 
      close front window 
      set still_active to count windows 
      if still_active = 0 then 
       quit 
      end if 
     end tell 
    end if 
end wipe_file 

Затем я добавил следующее к вершине. Запуск сценария по-прежнему работает с диалоговым окном выбора файла, но система никогда не позволяет перетаскивать мышью!

on open the_files 
    repeat with the_file in the_files 
     wipe_file(the_file) 
    end repeat 
end open 

Везде, где я смотрел (Google, переполнение стека), все говорят, что этот подход должен работать, но это не так. Я даже попытался удалить блок on run..., оставив только on open..., но тогда скрипт ничего не делает.

EDIT

Если создать новый сценарий с выше содержанием, и сохранить его в качестве приложения, а затем скопировать его в папку Applications, и вставить пользовательский значок на него, перетаскивание работает. Однако старый сценарий, который изначально не имел поддержки «на открытом», по-прежнему не работает даже после того, как в скрипт была добавлена ​​поддержка «открыто». Итак, теперь я думаю, что Apple должна установить какой-то специальный атрибут, чтобы указать, что скрипт поддерживает перетаскивание и по какой-то причине (потому что у него его не было при первом сохранении?) Apple не установила этот атрибут для моего файла , Глядя на Get Info и Show Package Contents для обоих приложений, есть некоторые странные различия:

  1. Вновь созданный (рабочий) приложение является только 693 KB, но старый (предположительно идентичны, но сломана) один 9,4 MB!
  2. В папке «Содержание/MacOS» новое (рабочее) приложение имеет файл «капелька», а старый (сломанный) имеет файл «апплет».

Первый из них странный, и заставило меня подумать о некотором повреждении файла, но второй из них явно является магическим параметром, который Apple использует для перетаскивания. Я проверил, что если я удалю блок «on open» из рабочего скрипта и сохраню его, Apple сделает не, обновите значок сценария, чтобы удалить стрелку «drop», и вы все равно можете перетаскивать на него файлы, но Ничего не произошло.

Так что кажется, что Apple решает, поддерживает ли сценарий перетаскивание или не первый раз, когда он сохраняет сценарий, а после этого вы получаете неправильные результаты, если не сохранить новый скрипт!

ответ

0

Вам не нужно вызывать терминал и открывать окно. Сценарий «do shell» открывает уже сеанс оболочки в фоновом режиме, который не отображается в терминале. Вы должны просто использовать его внутри блока try/end try, чтобы избежать остановки скрипта в случае ошибки (например, авторизации для файлов!)

Также вы используете 'srm' с опцией v (verbose). Этот параметр используется для отображения того, что делается, но вы не видите его, потому что вы закрываете окно.

Возможная проблема с вашим скриптом также может быть, когда ваш путь к файлу содержит специальные символы, которые должны быть экранированы в оболочке. Чтобы избежать этого, используйте «цитируемую форму».

Script ниже тестируется OK:

on run 
set the_file to choose file with prompt "Select the file to wipe:" 
wipe_file(the_file) 
end run 

on open the_files 
repeat with the_file in the_files 
    wipe_file(the_file) 
end repeat 
end open 

to wipe_file(file_to_wipe) 
set file_to_wipe to POSIX path of file_to_wipe 
set ok_to_wipe to display dialog "Are you sure you want to wipe \"" & file_to_wipe & "\"?" buttons {"Cancel", "OK"} default button "Cancel" 
if (button returned of ok_to_wipe = "OK") then 
    try 
     do shell script "srm " & quoted form of (file_to_wipe) 
    end try 
end if 
end wipe_file 
+0

Причина, я открыл окно в терминале, и использовал многословный вариант для СУР, так что я могу видеть прогресс, как она идет. У меня есть «задержка 3», так что я увижу результаты в течение 3 секунд после ее завершения, прежде чем она закроет окно. – GTB

+0

Я попробовал свой скрипт (сохранен как приложение на рабочем столе), и он работал для перетаскивания, хотя у него не было окна подтверждения. Затем я скопировал и вставил свой скрипт поверх вас, и он также работал для перетаскивания, с подробным окном подтверждения! Но это точная текстовая копия скрипта, который не работает, но не в папке «Приложения» и без специального значка. Позвольте мне поэкспериментировать с: а) копированием рабочего скрипта в приложения; б) поместить пользовательский значок на рабочий скрипт, чтобы увидеть, если он сломается (я подумал о пользовательском значке, когда увидел специальную стрелку «drop» на значке скрипта). – GTB

+0

Спасибо за помощь, это была не настоящая проблема, но это привело меня к обнаружению проблемы (см. Мой отредактированный вопрос). По-видимому, Apple решает, когда вы сначала сохраняете файл, будь то «апплет» или «капелька», в зависимости от наличия «on open», и после этого он не изменит его, даже если вы отредактируете содержимое для добавления или удалите блок «на открытом»! Кроме того, теперь я включил ваш блок «цитата» и «попытаюсь ... исправить попытку» в свой первоначальный скрипт. – GTB