我创建了以下AppleScript来删除所有选定的曲目:
property okflag : false
-- check if iTunes is running
tell application "Finder"
if (get name of every process) contains "iTunes" then set okflag to true
end tell
if okflag then
tell application "iTunes"
if selection is not {} then
repeat with this_track in selection
try
try
set cla to class of this_track
set floc to (get location of this_track)
delete this_track
on error error_message number error_number
display alert error_message message ("Error number: ") & error_number & "."
end try
if cla is file track then
my delete_the_file(floc)
end if
end try
end repeat
end if
end tell
end if
to delete_the_file(floc)
try
-- tell application "Finder" to delete floc
do shell script "mv " & quoted form of POSIX path of (floc as string) & " " & quoted form of POSIX path of (path to trash as string)
on error
display dialog "Track deleted, but could not be moved to trash" buttons {"Hmm"} default button 1 with icon 1
end try
end delete_the_file
当我选择单个项目时它工作正常,但是当我选择多个项目时,我得到:“无法获得选择项目2的位置”(错误号-1728)。我相信这是因为通过删除轨道,脚本对选择的索引已损坏。
我以为我会尝试首先删除自己的曲目列表:
tell application "iTunes"
if selection is not {} then
set to_delete to {}
repeat with this_track in selection
try
set cla to class of this_track
set floc to (get location of this_track)
if cla is file track then
set pair to {this_track, floc}
set to_delete to to_delete & pair
end if
end try
end repeat
repeat with pair in to_delete
set the_track to item 1 of pair
set floc to item 2 of pair
delete the_track
my delete_the_file(floc)
end repeat
end if
end tell
然后我得到'无法获得应用程序选择“iTunes”的第1项的第1项。我认为问题是“this_track”不是Track类的对象,而是一个选择项。如何从选择项中获取实际的跟踪对象?
如果您没有看到解决方案,我会欢迎有关调试或任何其他建议的提示。
答案 0 :(得分:2)
变量this_track
是对象说明符的引用。您必须使用contents
属性来获取封闭的对象说明符。在第二个循环中访问变量pair
也是如此。请参阅AppleScript language guide中的课程reference
上的课程参考部分。
列表to_delete
的构建方式存在另一个问题。语句set to_delete to to_delete & pair
不会生成对列表,而是列表。请参阅AppleScript language guide中的课程list
上的课程参考部分。
以下是您的第二个脚本的版本,其中已删除了这些错误:
tell application "iTunes"
if selection is not {} then
set to_delete to {}
repeat with this_track in selection
try
set cla to class of this_track
set floc to (get location of this_track)
if cla is file track then
set pair to {contents of this_track, floc}
copy pair to end of to_delete
end if
end try
end repeat
repeat with pair in to_delete
set the_track to item 1 of contents of pair
set floc to item 2 of contents of pair
delete the_track
my delete_the_file(floc)
end repeat
end if
end tell