Проблемы Applescript с переименованием файла и получением псевдонима для изменения его имени.

Я столкнулся с определенной проблемой с большим сценарием, который я пишу. Я пытаюсь переименовать все файлы в папке с префиксом «temp_», и при этом псевдоним этого файла по-прежнему может быть адресован из AppleScript после того, как префикс был добавлен в файл. Следующий код работает на НЕКОТОРЫХ машинах, но не на других. Я пробовал его на MBP 2018 года с 10.13, Mac Mini 2012 года с 10.13 и iMac 2015 года с 10.13 и 10.14. iMac — единственная машина, у которой есть проблема с этим кодом:

tell application "Finder"
set theSelection to the selection -- so you must have a folder with files selected in Finder before running this code.
set theFiles to the files of (item 1 of theSelection) --get the files
end tell
repeat with f from 1 to (count theFiles)
    set aItem to item f of theFiles -- set a variable as an individual file
    set pdfName to name of aItem --get the name of that file
    set aliasItem to aItem as alias -- get the alias of the file
    tell application "Finder"
        set the name of aliasItem to (("temp_" & (name of aliasItem)) as string) --rename the file
    end tell
    display dialog (aliasItem as string) buttons {"Cancel", "OK"} default button "OK" --this is just here for testing the script, to see what the system still thinks the file is named
    set posixPath to (POSIX path of aliasItem) --THIS is where the code fails on some machines. 
end repeat

Код дает сбой на НЕКОТОРЫХ машинах, когда я пытаюсь преобразовать псевдоним в путь posix. На машинах, на которых работает этот сценарий, в диалоговом окне тестового отображения указан псевдоним файла с новым именем. Итак, foo.txt становится temp_foo.txt. На машинах, на которых сценарий не работает, диалоговое окно дисплея возвращается только с foo.txt в качестве имени файла.

На машине, на которой это не удается, файл будет переименован в temp_foo.txt, как и должно быть, но псевдоним никогда не обновляется, поэтому он по-прежнему думает, что это просто файл foo.txt. На неисправных машинах последняя команда для установки переменной в posix-путь псевдонима завершается ошибкой, потому что псевдоним неверен, поскольку он все еще указывает на старое имя файла.

Если нужно, я просто переименую все файлы в одном цикле, затем вернусь и получу пути posix в другом цикле, так как делаю новый

set theTempFiles to files of (item 1 of theSelection)

Должен получить новый список файлов, теперь с их префиксом «temp_». Но мне больно вводить повторный цикл, который я не считаю действительно необходимым, поскольку на некоторых машинах код работает ОТЛИЧНО.

Кто может помочь мне заставить мой код работать нормально, а кто может сделать так, чтобы он не работал? Я просто хотел бы увидеть, насколько это большая проблема. Также было бы неплохо, если бы кто-нибудь мог сказать мне, что я делаю что-то ужасно неправильное в своем коде, и поэтому я получаю непредсказуемые результаты.

Почему бы не удалить псевдоним, переименовать исходный файл, а затем создать новый псевдоним, используя правильное новое имя файла?
Это не настоящий псевдоним, который вы могли бы увидеть в файловой системе. В AppleScript существует несколько способов ссылки на файлы, и псевдоним — один из таких способов. Не знаю, как лучше описать. Итак, когда сценарий терпит неудачу, он пытается преобразовать этот «псевдоним» в путь posix, но псевдоним (ссылка на файл) не имеет обновленного имени файла в самой ссылке. Таким образом, «псевдоним» по-прежнему относится к старому имени файла.
Дай угадаю - проблема в машине Мохаве? Предполагается, что это aliasссылка на файл, который не изменится, даже если он будет перемещен или переименован, но похоже, что он где-то сломался. Если вы в конечном итоге собираетесь использовать пути POSIX, вы можете взглянуть на использование NSURL через какой-нибудь AppleScriptObjC.
Что ж, одна из машин — это машина 10.13, у которой возникли проблемы. Я только что попробовал сценарий на 3 разных машинах 10.12, и он работал на всех из них. Но у меня есть виртуальная машина, которую я пробовал на двух разных машинах с 10.15, и сценарий не сработал на виртуальной машине на двух разных машинах (2018 MBP и 2015 iMac). Можете ли вы изменить имя файла через NSURL в ASObjC? Я очень мало знаю об ASObjC, и меня это немного пугает.
Вы можете использовать обычный AppleScript для изменения имени и просто использовать NSUrl для отслеживания ссылок на файлы. Я опубликую ответ с примером.

Ответы (1)

Я думаю, что это где-то сломалось, так как aliasпредполагается, что это ссылка на элемент файла, который остается действительным, даже если он будет переименован или перемещен. Если вы все равно собираетесь использовать пути POSIX, вы можете взглянуть на использование NSURLкласса Cocoa (через какой-либо AppleScriptObjC), чтобы отслеживать ссылки на файлы, поскольку в конечном итоге это то, что используется (или должно использоваться).

use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

tell application "Finder" -- get the selection
    set theSelection to selection
    set theFiles to the files of (first item of theSelection) as alias list
end tell

repeat with anItem in theFiles
    set anItem to POSIX path of anItem
    set fileRefURL to (current application's NSURL's fileURLWithPath:anItem)'s fileReferenceURL() -- get file reference from path
    tell application "System Events" to set the name of disk item anItem to "temp_" & (name of disk item anItem)
    set posixPath to (fileRefURL's |path|()) as text -- get path from file reference
    display dialog "Before:" & return & anItem & return & return & "After:" & return & posixPath buttons {"Cancel", "OK"} default button "OK"
end repeat