2010-05-26 3 views
1

Я создал этот сценарий Applescript для создания символических ссылок.
Appart from 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

Я не уверен, что именно вы пытаетесь сделать, но У меня есть предположение. Является ли идея, что вы хотите, чтобы каждый файл удалялся по сценарию и создавал символическую ссылку на каждый из них на рабочем столе? Итак, если я опустил ~/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.


Edit: Если вы хотите сделать что-то в одном файле, это довольно легко. Вместо того, чтобы использовать 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 и игнорировать остальные. Кроме того, в конце мы показываем диалог, содержащий имя символической ссылки, поэтому пользователь знает, что только что произошло.

+0

Thnks, что я на самом деле хочу сделать для одного файла. Я использовал повтор, потому что получил этот пример с сайта и не знаю, как его изменить для одного файла. – Petruza

+0

Редактировать: он отлично работает для файлов, но он не подходит для папок, и это то, что я хочу, чтобы Lynk больше всего. Сообщение об ошибке: «В:/Пользователи/petruza/Desktop /: Файл существует» на рабочем столе нет файла с тем же именем исходного файла, и это работает с обычными файлами, поэтому путь правильный. Похоже, что при получении папки, выпавшей на скрипт, она интерпретирует ее как «/», которая является тем, что добавлено в путь к рабочему столу в сообщении об ошибке. Если я добавлю косые черты к пути, ошибка покажет две завершающие косые черты. – Petruza

+1

Думаю, будет лучше, если я сам изучу аппликацию. можете ли вы порекомендовать хороший учебник? – Petruza

1

В качестве примера вы можете работать с 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 
Смежные вопросы