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
с ошибками.