Я не уверен, что именно вы пытаетесь сделать, но У меня есть предположение. Является ли идея, что вы хотите, чтобы каждый файл удалялся по сценарию и создавал символическую ссылку на каждый из них на рабочем столе? Итак, если я опустил ~/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
и игнорировать остальные. Кроме того, в конце мы показываем диалог, содержащий имя символической ссылки, поэтому пользователь знает, что только что произошло.
Thnks, что я на самом деле хочу сделать для одного файла. Я использовал повтор, потому что получил этот пример с сайта и не знаю, как его изменить для одного файла. – Petruza
Редактировать: он отлично работает для файлов, но он не подходит для папок, и это то, что я хочу, чтобы Lynk больше всего. Сообщение об ошибке: «В:/Пользователи/petruza/Desktop /: Файл существует» на рабочем столе нет файла с тем же именем исходного файла, и это работает с обычными файлами, поэтому путь правильный. Похоже, что при получении папки, выпавшей на скрипт, она интерпретирует ее как «/», которая является тем, что добавлено в путь к рабочему столу в сообщении об ошибке. Если я добавлю косые черты к пути, ошибка покажет две завершающие косые черты. – Petruza
Думаю, будет лучше, если я сам изучу аппликацию. можете ли вы порекомендовать хороший учебник? – Petruza