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