2014年04月29日

AppleScriptでファイルやフォルダを取得する

AppleScriptを使うからには、なにかしらフォルダやファイルを操作しようとしているはずだと思われます。
なので、操作したいフォルダやファイルを取得します。
以下その方法を何点か。

*****フォルダの取得 ---ダイアログが開くのでフォルダを選びます。結果はエイリアス(alias)で得られます

set theAlias to choose folder


例えばOSの入ってるHDDにあるピクチャフォルダの中の”tmp”というフォルダを選んだとすると、

結果; alias "Macintosh HD:Users:Ryo:Pictures:tmp:"

*****ファイルの取得 ---ダイアログが開くのでファイルを選びます。結果はエイリアス(alias)で得られます

set theAlias to choose file


例えば上記tmpフォルダ内のmypicture.jpgというファイルを選んだとすると、

結果; alias "Macintosh HD:Users:Ryo:Pictures:tmp:mypicture.jpg"


*****取得したエイリアスをテキストパスに変換

set textPath to theAlias as text


結果; "Macintosh HD:Users:Ryo:Pictures:tmp:"

set textPath to theAlias as string

set textPath to theAlias as Unicode text

でも同じ


*****POSIXパスに変換  alias, テキストパスから変換可。Finder参照からは直接変換できない。

set posixPath to POSIX path of theAlias

set posixPath to POSIX path of textPath

set posixPath to (textPath)'s POSIX path

set posixPath to (theAlias)'s POSIX path


結果; "/Users/Ryo/Pictures/tmp/"


*****Finderを使ってフォルダ参照(パス)を取得。指定したフォルダの中にある全てのフォルダのFinder参照がリストになって返ってくる。 alias, Finder参照が使用可。POSIXパスは不可。テキストパスは”alias textPath”で使用可

例えば上記で取得した ”theAlias” というエイリアスの中にある全フォルダがほしいとき、

tell application "Finder"

set theList to every folder of theAlias

end tell


 


tell application "Finder"

set theList to every folder of alias textPath

end tell



*****Finderを使ってファイル参照(パス)を取得。指定したフォルダの中にある全てのファイルのFinder参照がリストになって返ってくる。不可視ファイルは取得されないみたい。

tell application "Finder"

set theList to every file of theAlias

end tell



*****Finderで選んでいるフォルダおよびファイルのFinder参照を返す。2つ選んでも一つしか取得できない。リスト型ではないみたい。

tell application "Finder"

return selection

end tell


---------

set a to test()

set aAlias to a as alias

 

on test()

tell application "Finder"

return selection

end tell

end test

-----------

とかすると、Finder参照からaliasやテキストパスに変換可。


*****指定したフォルダ内にあるフォルダおよびファイルの全リストを取得。こちらはパスではなくただの名前がリストになって返ってくる。フォルダの指定にはaliasもテキストパスも使える。Finder参照は使えない。

set theList to (list folder theAlias)


結果; {".DS_Store", "1111.jpg", "mypicture.jpg", "test", "test.txt", "work"}
"test", "work”はフォルダ、"1111.jpg", "mypicture.jpg","test.txt”はファイル。".DS_Store”は不可視ファイル。

このままでは不可視ファイルも拾ってくるので、”without invisibles”を付けると、

set theList to (list folder theAlias without invisibles)


結果; {"1111.jpg", "mypicture.jpg", "test", "test.txt", "work"}
posted by Ryo Yamashita at 19:37| Comment(0) | AppleScript

AppleScriptのファイル参照、パス、などについて

趣味で、AppleScriptを書くようになって半年ほど経ちました。
やっと色々と分かって来た模様。ここらで一つ、備忘録的に、はまったところをまとめておこうと思います。
ちなみに専門家ではないので、経験的にこんなところかな、って感じで書いておりますので間違いがあるかも知れませんが、実用には問題ないかと思われます。

まずはパスとか。ファイルやフォルダを扱うときのパスで、注意する事があります。
というか、これをしっかり理解していないと所々でつまっちゃって、前に進みません。
AppleScriptでは、パス、というかファイル参照が4種類存在します。
Finder参照、エイリアス(alias)、テキストパス、POSIXパス

このうち、いわゆるパスっていうのはテキストパスとPOSIXパスだと思われます。

テキストパス
Macintosh HD:Users:Ryo:Pictures:tmp:
Photo:workspace:tmp:
Macintosh HD:Users:Ryo:Pictures:tmp:mypicture.jpg


POSIXパス
/Users/Ryo/Pictures/tmp/
/Volumes/Photo/workspace/tmp/
/Users/Ryo/Pictures/tmp/mypicture.jpg

具体的にはこんな感じ。
要はUnix的なパスの指定はPOSIXパス。それをMac的に書くとテキストパス。
上段はOSの入ってるHDD内のtmpというフォルダのパス。中段はPhotoという名前の外付けHDD内にあるtmpというフォルダのパス。
フォルダの区切りが ”:” か “/“ かの違いとルート(最初のフォルダ)の表現が違います。
下段はフォルダではなく、ファイルのパス。最後に ":" とか "/" とか付きません。

普通にスクリプト内でテキストとして扱う場合はテキストパスを使います。パスからフォルダ名を取得したり、新たにフォルダを追加するためにパスに文字列を付け加えたりする時。
で、POSIXパスはスクリプト内でシェルスクリプトなどのUnixコマンドを使いたいとき、Mac的なテキストパスの指定では受け付けてくれない時があるので、そういう場合はPOSIXパスを使います。

エイリアス(alias)はパス、というよりは機能、って感じかと思います。
スクリプト内でパスとしてエイリアスを指定しておくと、そのフォルダやファイルを移動しても、自動で追いかけてくれるというものです。
詳しくは分かりません。が、確かにゴミ箱に移動してもパスとして通ります。
エイリアスはテキストではありません。
例えば、

set textPath to "Photo:workspace:tmp:"

set newPath to textPath & "newfolder:"


などどすると、

"Photo:workspace:tmp:newfolder:"

と、文字列“Photo:workspace:tmp:”の後に、文字列“newfolder:”を結合した値が返ってきますが、

set textPath to "Photo:workspace:tmp:"

set theAlias to textPath as alias

set newPath to theAlias & "newfolder:"


と、textPathをエイリアスに変換してから文字列を足そうとしても、

{alias "Photo:workspace:tmp:", "newfolder:"}

と、変なリストで返ってきます。一つ目がエイリアスで、二つ目が文字列、みたいな。

なので、文字列として扱う場合はエイリアスのままでは使えないので、

set textPath to theAlias as text


などとして、テキストパス(というかただのテキスト)にして扱うようにします。

最後にFinder参照。
これはFinderの中でのファイル参照って事だと思います。
tell application “Finder” などとFinder経由でパスを取得しようとすると、

{folder "tmp" of folder "Pictures" of folder "Ryo" of folder "Users" of startup disk of application "Finder"}

みたいな値が返ってきます。
これも当然テキストではないので、テキストとして扱いたい場合は、

set textPath to abc as text --(変数abcにFinder参照が入ってるとします)

みたいな感じでテキストに変換します。
ちなみに上のFinder参照をテキストパスに変換すると、

Macintosh HD:Users:Ryo:Pictures:tmp:

です。

始めはこの4つがなにがなにやら分からず苦労しましたが、分かればなんて事ないですね。
実際にはスクリプト内でこの4つを相互に変換しながら使っていきます。
というか、AppleScriptでファイル参照を取得しようとすると、Finder参照かエイリアスで取得されるので、それをテキストパスやPOSIXパスに変換して処理していく、って感じですかね。

****まとめ****
エイリアス ---テキストパス、POSIXパスに変換可
alias "Macintosh HD:Users:Ryo:Pictures:tmp:"

テキストパス ---エイリアス、POSIXパスに変換可
Macintosh HD:Users:Ryo:Pictures:tmp:

POSIXパス ---テキストパスに変換可。エイリアスには変換できない。
/Users/Ryo/Pictures/tmp/

Finder参照 ---エイリアス、テキストパスに変換可。POSIXパスには変換できない。
{folder "tmp" of folder "Pictures" of folder "Ryo" of folder "Users" of startup disk of application "Finder"}
posted by Ryo Yamashita at 17:51| Comment(0) | AppleScript