Перемещение целых папок с помощью AppleScript - PullRequest
0 голосов
/ 15 декабря 2018

Это мое самое первое использование AppleScript.Я пытаюсь использовать его для перемещения более 100 папок (и их файлов содержимого) из одного места в другое.Я не просто перемещаю файлы, потому что хочу поддерживать систему хранения.Итак, у меня есть папки, перечисленные в TXT-файле в следующем формате:

Macintosh HD: Пользователи: Том: Музыка: iTunes: Африка Бамбаата

Macintosh HD: Пользователи:Том: Музыка: iTunes: Air

И затем я запускаю следующее в AppleScript:

tell application "Finder"
    set TextFile to (choose file with prompt "Select your text file" of type {"txt"})
    set My_Folder to (choose folder with prompt "Select your destination folder")
    set List_files to paragraphs of (read TextFile)
    move List_files to My_Folder
end tell

Однако я получаю следующую ошибку:

error "Finder получил ошибку: обработчик не может обрабатывать объекты этого класса."число -10010

Любая помощь в том, что я здесь делаю не так?

Очень признателен!

1 Ответ

0 голосов
/ 15 декабря 2018
tell application "Finder"
    set TextFile to (choose file with prompt "Select your text file" of type {"txt"})
    set My_Folder to (choose folder with prompt "Select your destination folder")
    set List_files to paragraphs of (read TextFile)
    move List_files to My_Folder
end tell

В настоящее время List_files - это просто список текстовых объектов, то есть

{"Macintosh HD:Users:Tom:Music:iTunes:Afrika Bambaataa",
 "Macintosh HD:Users:Tom:Music:iTunes:Air", ...}

, поэтому вам нужно Finder переместить некоторый текст впапка, которая не имеет смысла.Вы должны сообщить Finder , что этот текст представляет путь к папке, используя спецификатор folder.Так как это невозможно сделать массово, вы должны выполнить итерацию по списку:

repeat with fp in List_files
    move folder fp to My_Folder
end repeat

Однако на самом деле я бы не стал делать это так, поскольку для этого потребуется более 100 отдельных команд move.- по одному на каждый предмет в List_files.Вместо этого мы сначала отредактируем элементы списка, добавив к каждому элементу спецификатор folder, а затем , а затем move - список папок в одной команде:

repeat with fp in List_files
    set fp's contents to folder fp
end repeat

move List_files to My_Folder

В зависимости от размера файлов и продолжительности передачи сценарий может прервать работу до завершения передачи.Я не совсем уверен, какое влияние это окажет на существующую передачу файлов.Я подозреваю , что AppleScript просто потеряет соединение с Finder , но передача будет продолжена в любом случае, поскольку команда уже была введена (еще одно преимущество использования одной команды move вместократных).Но, если вы хотите избежать выяснения, мы можем увеличить время ожидания, чтобы быть в безопасности:

with timeout of 600 seconds -- ten minutes
    move List_files to alias "Macintosh HD:Users:CK:Example:"
end timeout

Окончательный сценарий выглядит примерно так:

tell application "Finder"
    set TextFile to (choose file with prompt "Select your text file" of type {"txt"})
    set My_Folder to (choose folder with prompt "Select your destination folder")

    set List_files to paragraphs of (read TextFile as «class utf8»)

    if the last item of the List_files = "" then set ¬
        List_files to items 1 thru -2 of List_files

    repeat with fp in List_files
        set fp's contents to folder fp
    end repeat

    move List_files to My_Folder
end tell

Дополнительная строка, котораяЗапуски if the last item of... - это всего лишь мера предосторожности на случай, если последняя строка текстового файла - пустая строка, как это часто бывает.Он проверяет, содержит ли List_files пустую строку в качестве последнего элемента, и, если это так, удаляет ее;оставив его, вы получите ошибку позже в скрипте.

РЕДАКТИРОВАТЬ: Работа с несуществующими папками

Если цикл repeat выдает ошибку из-за нераспознанного имени папки,тогда мы можем исключить эту конкретную папку из списка.Однако будет проще, если мы создадим новый список, который будет содержать только те папки, которые были проверены (т.е. те, которые не выдавали ошибку):

set verified_folders to {}

repeat with fp in List_files
    try     
        set end of verified_folders to folder fp
    end try
end repeat

move the verified_folders to My_folder

Это также означает, что мы можем удалить начало строкиif the last item of..., так как проверка, которую это выполняет, теперь должна быть перехвачена как блок try ... end try с ошибками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...