Получение имени файла файлов отбрасывается на сценарии

Я сделал этот сценарий Applescript для создания символьных ссылок.
Appart от POSIX path of, как я могу получить имя файла, без пути, перемещаемого файла?

on open filelist
    repeat with i in filelist
        do shell script "ln -s " & POSIX path of i & " /Users/me/Desktop/symlink"
    end repeat
end open

PS: Я знаю, что это ожидает, что много файлов будут отброшены, и пытается создать много ссылок с тем же именем, которое дает ошибку. На самом деле я скопировал этот пример с веб-сайта и поскольку я почти ничего не знаю о Applescript, я не знаю, как сделать это для единственного файла, справка на этом ценилась бы также.

1
задан kiamlaluno 9 July 2010 в 20:27
поделиться

2 ответа

Я не уверен, что именно вы пытаетесь сделать, но у меня есть предположение. Есть ли идея, что вы хотите взять каждый файл, помещенный в сценарий, и создать символическую ссылку на каждый из них на рабочем столе? Поэтому, если я отброшу ~ / look / at / me и ~ / an / example , у вас будут ~ / Desktop / me и ~ / Рабочий стол / пример ? Если это то, что вы хотите, то вам повезло: ln -s ... делает именно это. ( Изменить: Хотя вы должны остерегаться случая с двумя аргументами.) Таким образом, ваш код может выглядеть так:

-- EDITED: Added the conditional setting of `dest` to prevent errors in the
-- two-arguments-to-ln case (see my comment).

on quoted(f)
    return quoted form of POSIX path of f
end quoted

on open filelist
    if filelist is {} then return
    set dest to missing value
    if (count of filelist) is 1 then
        tell application "System Events" to set n to the name of item 1 of filelist
        set dest to (path to desktop as string) & n
    else
        set dest to path to desktop
    end if
    set cmd to "ln -s"
    repeat with f in filelist & dest
        set cmd to cmd & " " & quoted(f)
    end repeat
    do shell script cmd
end open

Обратите внимание на использование цитируемой формы ; он заключает свой аргумент в одинарные кавычки, поэтому выполнение в оболочке не сделает ничего забавного.

Если вы хотите получить имя файла по другой причине, вам не нужно обращаться к Finder; вместо этого вы можете использовать системные события:

tell application "System Events" to get name of myAlias

вернет имя файла, хранящегося в myAlias ​​.


Изменить: Если вы хотите что-то сделать с одним файлом, это довольно просто. Вместо использования repeat для итерации по каждому файлу просто выполните то же действие с первым файлом, доступ к которому осуществляется через элемент 1 списка . В этом случае вам может понадобиться что-то вроде этого:

-- EDITED: Fixed the "linking a directory" case (see my comment).

on quoted(f)
    return quoted form of POSIX path of f
end quoted

on open filelist
    if filelist is {} then return
    set f to item 1 of filelist
    tell application "System Events" to set n to the name of f
    do shell script "ln -s " & ¬
        quoted(f) & " " & quoted((path to desktop as string) & n)
end open

Это почти то же самое, но мы берем первый элемент в filelist и игнорируем остальные.Кроме того, в конце мы отображаем диалоговое окно, содержащее имя символической ссылки, чтобы пользователь знал, что только что произошло.

1
ответ дан 3 September 2019 в 00:17
поделиться

В качестве примера вы можете работать с Finder вместо сценария оболочки, чтобы получить имя одного файл, который помещается в сценарий, сохраненный как приложение. Если вам не нужен диалог отображения, вы можете удалить его, но у вас есть имя файла в качестве переменной для работы:

on open the_files
    repeat with i from 1 to the count of the_files
        tell application "Finder"
            set myFileName to name of (item i of the_files)
        end tell
        display dialog "The file's name is " & myFileName
    end repeat
end open
1
ответ дан 3 September 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: