Получение имени файла из файлов, сброшенных на скрипт - PullRequest
1 голос
/ 27 мая 2010

Я сделал этот сценарий 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, я не знаю, как сделать это для отдельного файла, помощь по этому вопросу также будет оценена.

Ответы [ 2 ]

1 голос
/ 27 мая 2010

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

-- 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

Обратите внимание на использование quoted form of; он заключает аргумент в одинарные кавычки, поэтому выполнение внутри оболочки не принесет ничего смешного.

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

tell application "System Events" to get name of myAlias

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


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

-- 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 голос
/ 27 мая 2010

Например, вы можете работать с 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
...