複数参照

追記
 困ったことに、OS Xでは以下で説明するスクリプトの多くが動きません。そのため、まことに残念ながら、現在は事実上使えない形式となっています。

複数参照とは?

 複数参照というのは、Appleので正式な用語では無いのですが、要は「参照のリスト」です。

tell application "Finder"
	{folder 1 of disk 1, folder 3 of disk 1, folder 4 of disk 1}
end tell

 複数参照をつくり出す参照形式は、全要素参照範囲参照フィルタ参照です。

tell application "Finder"
	every folder of disk 1 -- 全要素参照(folders of disk 1でもいい)
	folders 1 thru 3 of disk 1 -- 範囲参照
	(folders whose name contains "data") of disk 1 -- フィルタ参照
end tell

 selectionは、多くのアプリケーションに存在する属性で、現在選択されているオブジェクトを複数参照しています。
 以下のスクリプトを実行すると、selectionが参照のリストであることがわかります。

tell application "Finder"
	selection -- of applicarion "Finder"
end tell

repeatかeveryか?

 リストですから、repeatを使って項目を一つずつ取り出して処理する事を思い付きます。
 例えば、次のようなスクリプトです。

tell application "Finder"
	repeat with curItem in selection
		set label index of curItem to 1
	end repeat
end tell

 ところが、リストを対象オブジェクトに指定する事で、一気に属性を変更したり命令を実行したりする事ができます。
 以下のスクリプトも、先ほどのスクリプトと同じ処理をします。

tell application "Finder"
	set label index of selection to 1
end tell

 ただし、実行速度は圧倒的に後者の方が高速です。
 スクリプトも分かりやすく簡単になる上に、処理も高速ならば、これを使わない手はありません。
 難点は、対応していないアプリケーションが多いことと、パスによる参照のリストには対応していない場合が多いことです。

複数参照の複数参照

 全参照を連続して書く事で、ある階層の全てのオブジェクトを指定できます。
 対応していないアプリケーションも多いので、使える場面は限られますが、とりあえずFinderが対応してますから、それだけでも使い所はあると言うものです。
 次のように書くだけで、デスクトップから2階層下の全てのフォルダが指定できます。

folders of folders of disks

 リストとして並べても複数参照として成り立つので、次のように書くと、デスクトップから2階層下までの全てのフォルダになります。

{disks, folders of disks, folders of folders of disks}

階層下のフォルダを全て処理

 a reference to演算子を使って参照渡しをすれば、渡した先で も複数参照として処理できるわけなんで、次のようにフォルダに含まれる全てのフォルダについての処理も簡単に可能になります。

tell application "Finder"
	activate
	
	set theFolder to choose folder
	
	repeat
		set theFolder to a reference to (folders of theFolder)
		if contents of theFolder = {} then exit repeat
		open theFolder -- ここで色々な処理を
	end repeat
end tell

 再帰呼び出しを使うより簡単です。