現在実行中のスクリプトが、ボリュームのどの階層に位置しているかを知りたいことは頻繁にあると思います。
まず、基本的な方法として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
path toを使う以外にも相対パスを得る方法はあります。
alias ":"とすると、path2Meハンドラと同じように、スクリプトのあるフォルダを得ることが出来ます。
これは、エイリアス値が持っている性質の一つです。
alias ":"
このままでは、構文確認を行った時点で変換されてしまうので「スクリプト編集プログラム」の存在するフォルダのパスになります。
そこで、以下のようにしておけば、構文確認時では無くスクリプト実行時に変換されます。
":" as alias
先の方法にくらべると、ごく簡単ですから、通常はこの方法を使う事になるでしょう。
また、"::"とコロンを二つ並べると更に上の階層のフォルダのパスを得る事ができ、さらに同階層のファイル「初期設定」ならば ":初期設定"と表現する事もできます。
今まではアプリケーションからの相対パスを求めていましたが、「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