相対パスを得る

path to命令

 現在実行中のスクリプトが、ボリュームのどの階層に位置しているかを知りたいことは頻繁にあると思います。
 まず、基本的な方法としてpath to命令を使う手があります。
 この方法で手にはいるのはエイリアス値です。

path to current application

 path to meでも同様の結果がえられます。

フォルダを調べる

 相対パスが必要な場合、アプリケーションそのものよりも、むしろアプリケーションが存在しているフォルダのパス方が必要な場合が多いと思います。
 まずは、Finderのcontainer属性を利用する方法です。

path2Me()

on path2Me()
	set thePath to (path to current application)
	tell application "Finder" to set thePath to container of thePath
	return thePath as alias -- Finderで使う場合はaliasに変換する必要は無い
end path2Me

 この場合、theContainerに入る参照はFinderのオブジェクトを利用した参照となるので、as aliasとしてエイリアス値に変換しています。
 次は、文字列に変換した後、text item delimitersを利用してフォルダのパスを求めています。
 一見面倒になっただけのように見えますが、先ほどのハンドラより高速に動作します。

path2Me()

on path2Me()
	set thePath to path to current application as string
	set tmp to text item delimiters
	set text item delimiters to ":"
	set thePath to text from text item 1 to text item -3 of thePath
	set text item delimiters to tmp
	return thePath as alias
end path2Me

※バンドル形式のアプリケーションでない場合、パスの最後に":"が付かないので、"text item -3"ではなく、"text item -2"とする必要があります。

":" as alias

 path toを使う以外にも相対パスを得る方法はあります。
 alias ":"とすると、path2Meハンドラと同じように、スクリプトのあるフォルダを得ることが出来ます。
 これは、エイリアス値が持っている性質の一つです。

alias ":"

 このままでは、構文確認を行った時点で変換されてしまうので「スクリプト編集プログラム」の存在するフォルダのパスになります。
 そこで、以下のようにしておけば、構文確認時では無くスクリプト実行時に変換されます。

":" as alias

 先の方法にくらべると、ごく簡単ですから、通常はこの方法を使う事になるでしょう。
 また、"::"とコロンを二つ並べると更に上の階層のフォルダのパスを得る事ができ、さらに同階層のファイル「初期設定」ならば ":初期設定"と表現する事もできます。

※この方法、初期のMac OS Xでは使えなかったのですが、OSバージョン10.7.5現在では使えます。
 どのバージョンから使えるようになったのか、情報をお持ちの方はお知らせ下さい。

ファイルからの相対パス

 今まではアプリケーションからの相対パスを求めていましたが、「HyperCard」や「ファイルメーカーPro」「MacPerl」などのファイルにスクリプトを埋め込めるアプリケーションの場合、アプリケーションの場所では無く、スクリプトが埋め込んであるファイルの場所からの相対パスが欲しくなります。
 これはアプリケーションによって対処法が異なりますが、大まかには次の2種類の方法があります。

 2番目の方法が正統なやりかたと言えますが、必ず可能というわけではありません。
 例えばHyperCardでは、以下の関数をスタックスクリプトなどにHyperTalkとして置き、AppleScriptから呼び出して使います。
 何故か、AppleScriptにはthe destinationに当たる属性は用意されていないようです(あったりして)

function path2Me
  put the itemDelimiter into tmp
  put the destination into thePath
  set the itemDelimiter to ":"
  delete last item of thePath
  set the itemDelimiter to tmp
  
  return thePath
end path2Me

2000-05-26 -2000-08-27 -2000-12-13 -2012-10-12