title1
navigation bar3



[ 1-p1 | 1-p2 | 1-p3 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 ] [日経マック連載Index ]

連載[1-2] たくさんのファイルをまとめて名前変更する


《 choose folder…でダイアログボックスが 》
先生
だろう?それほど簡単にスクリプティングが理解できたら、私の立場はどうなるんだね。では1行ずつ行こうか。
まず、図2(別ウィンドウのスクリプト)の1行目から行こうか。「set ○○ to △△」という構文は分かるね?
はい、さっき出てきましたから。でも「set aFolder to…」の「aFolder」っていうのは?
先生
これは単なる「変数」なんだ。データを入れておく器みたいなものだ。方程式のxとかyと同じで、中の値は変化する。
1文字だけでなく「aFolder」のように複数の文字を使って分かりやすい名前を付けることができるんだ。
ちなみに「aFolder」という名前は私の好みで「a folder(1つのフォルダ)」をくっつけただけだ。
単なる「x」でも「theFolder」でも構わないよ。
なるほど。つまりテンポラリーな値を格納するデータということですね。
次の「to (choose folder with prompt "名前を整理したいフォルダを選んで下さい")」っていうのは何なんですか。aFolderに何かを代入しているようですが、僕にはてんで意味不明なんですけど。
先生
これがちょっと複雑なんだ。というのは、変数に何を入れるかを選択するためにまず「名前を整理したいフォルダを選んで下さい」というダイアログを表示するんだ。そこで該当するフォルダを選択するわけだな。
さっき表示されたダイアログですね。でもそれが変数の中身になるんですか?
先生
いや、そう早合点してもらっては困る。まず「choose folder」というのが「フォルダを選択しろ」という命令だってことは想像できるね。
はい。でもその後の「with prompt」っていうのは?
先生
これはフォルダを選択する際に 「名前を整理したいフォルダを選んで下さい」というメッセージが付いたダイアログを表示して選ばせろ、ということなんだよ。
なるほど。マックでよく出てくるファイルやフォルダを選択するダイアログですね?
先生
そうそう、それで変数aFolderには、選択したフォルダのハード・ディスク内の位置を示す「alias pathname」という道順が記憶されることになる。
すると先生、変数の中身はファイルやフォルダの名前だけじゃなくて「邪馬台国までの里程」みたいなものでもいいわけですね。
先生
うん、そうだよ。ただalias pathnameは倭人伝よりはもっと正確じゃないと困るがね。そうして、このダイアログで選ばれたフォルダの中のファイルが、名前を変える対象になるわけだ。分かったかな。
なぁるほど、これで本部長が名前を統一したがってるフォルダがどこにあるかを指定できるんですね。




《 Excelやファイルメーカーにもtellできる 》
先生
その通り。それで次の行以下は、そこで指定されたフォルダの中のファイルについて名前を変更する作業を行うわけなんだ。
2行目の

  tell application "Finder" 

は、さっきと同じだから分かります。でも今度は目的句がないですね。
先生

あぁ「to ××」というやつね。これは必ずしもtellの後に続かなくてもいいんだよ。

  tell
   (伝える内容)
  end tell

でサンドイッチされた部分が、アプリケーションに伝える内容だからなんだ。

ここでは「application "Finder"」にtellしていますが、ほかのアプリケーション、例えば「Microsoft Excel」とか「ファイルメーカーPro」とかにも命令をtellできるんでしょうか?
先生
いい質問だ。もちろんできる。それができるからAppleScriptはすごいのさ。まぁそれはさて置き、次へ進もう。
TOP




すべてのファイルについてrepeat文で繰り返す

次に出てくる

 repeat with aFile in (every file of aFolder)

ですが 「repeat」っていうのは「繰り返せ」っていうことですよね。

先生

これは、AppleScriptが作業の流れを制御する構文の1つで、

  repeat
   (繰り返す内容)
  end repeat

という形で用いる。
repeatからend repeatに挟まれた文を、特定の回数だけ繰り返すんだ。後ろから2行目に「end repeat」っていう文があるだろう。この間に挟まれた、7行にわたる部分 が特定の回数だけ繰り返し実行されるんだ。

特定の回数っていうと?
先生

この場合は、aFolderの中にあるファイルの数だけさ。いつまで繰り返すのかを決めるのが、with aFile …なんだ。

  repeat with ×× in △△

の形だと、△△の中の項目を毎回1つずつ××に代入して、すべての項目について繰り返せ という意味になる。

ということは、aFolderの中にあるすべてのファイルについて繰り返せ、ということですか?どうもよく分からないんですけど…。
先生

この構文では通常、in以下で指定されるものはリストになる。例えば、

  set s to 0
  repeat with x in {10,50,100}
   set s to s + x
  end repeat

だったら、xの値が10,50,100と次々に変化しながら「set s to s+x」という文が繰り返し実行される。repeat文を抜けると、sの値は160になるわけだ。

ちょっと待ってください。今度は「リスト」っていうのが分からないんですけど。
先生
要するにデータの集合でね、普通は{1,2,3}のようにカンマで区切って{ }で囲んで表現するんだな。
「every file of aFolder」っていうのはリストなんですか。あぁそうか、aFolderの全てのファイル、って言うとリストっぽいですね。
先生
「every ×× of △△」と指定した結果は、実はリストになることが決まっているんだ。
だいぶ分かってきました。
先生
xやaFileは「ループ変数」といって、in以下で指定されるリストの値を保存する。aFileには繰り返しの1回ごとに、リストの中にあるファイルが1つずつ格納されるんだよ。
なるほど、1回繰り返すごとに次々にファイルを変えて、すべてのファイルの名前を加工させようって企んでるわけですね。
先生
うん、企みというのは気に食わんが、まぁそう思ってくれていいだろう。ここまでは大体いいかな?
はいっ、本部長に説明できるくらいは理解したつもりです。


《 国名の単語だけを取ってくる
先生
よしっ、ではrepeat文の中身すべてのファイルに対して繰り返す内容を見て行こう。
まず最初の   set aFileName to name of aFile は、最初の例と同じだね。
えぇ、単純に考えると「aFileの名前をaFileNameに代入しろ」 ってことなんでしょう。
aFileNameっていうのは新しい変数ですね。
先生
その通り。そこで、次も同じ命令なんだが、分かるかな?  set aNewFileName to (word 4 of aFileName)
新しく作った変数「aNewFileName」を「word 4 of aFileName」にしろ、っていうことになりますが、問題は「word 4 of aFileName」ですよね。これは「aFileNameの4番目の単語」だから、そうかっ、ファイル名の最後についている国名を持って来るんだっ。どうですか、先生?
先生
うん、まぁよしとしようか。答えはいいが、君の頭はマックより1000分の1くらい回転が遅いがね。
まいったなぁ、先生。ほかのことをやらせたら僕だってパソコンよりはるかに上手くやりますよ。
TOP


tellやrepeatはブロックに着目しよう
先生
まぁいいからいいから。だが次の、repeat with i from 1 to 3からend repeatまでの3行はどうかな?これもすぐに分かれば、大したものなんだが。
またしてもrepeat。よく見るとrepeat〜end repeatの中に、さらにrepeatがありますね。
先生
これまでは言わなかったが、スクリプトはタブでインデント(字下げ)されているだろう。実はこれが重要なんだ。
HyperTalkでもありましたよねっ。
先生
そうそう、HyperTalkと同じように、AppleScriptの「スクリプト編集プログラム」もただのエディターじゃなくて、自動的に最低限の構文をチェックしてくれるんだ。
そうです。とっても見やすいですよね、この機能は。
先生
いや見た目の機能だけではないんだ、これが。 同じ位置にインデントがあるステートメント(文)に挟まれた間は、ずぅっとその始まりの命令が生きているってわけだ。実はこのスクリプトは、図3のように3つの階層構造があるんだよ。

図3 3つのブロック
tell〜end tellのブロックがFinderへの命令、repeat with aFile…〜end repeatのブロックがすべてのファイルについての繰り返し、そしてもう1つrepeat with i…〜end repeatがあるわけですね。
先生

2番目のrepeatは、

repeat with ×× from △△ to □□
 (繰り返す内容)
end repeat

という構造になっている。これは、1回繰り返すたびに××という変数に,自動的にある値が代入される。その値は最初は△△、1回繰り返すごとに1が加算され、最後の繰り返しでは□□になる。

はぁ。
TOP



単語を切ったりつないだり自由自在
先生

では、どうしてiなんていう面倒くさいものを使うかというとだね、繰り返される内容を見てくれたまえ。

set aNewFileName to
(aNewFileName & " " & word i of aFileName)

ここに「word i of aFileName」という文があるだろう。
iを1,2,3と順に繰り返すと、word iは、aFileNameに含まれる単語を順々に指すことになる。いいかな?
aFileNameが「94 12 01 USA」ならword iは「94」「12」「01」と繰り返すごとに内容が変化するんだ。
一方、aNewFileNameという変数を見てごらん。これには最初に、word 4 of aFileNameが代入される。
aFileNameが「94 12 01 USA」なら、aNewFileNameはただの「USA」。
その後で、repeat with i…の中で「set aNewFileName to (aNewFileName & " " & word i of aFileName)」が3回繰り返されて、最終的にaNewFileNameは「USA 94 12 01」となるんだ。

「&」っていうのは?
先生
文字列と文字列をつなぐ演算子だ。
つまりaNewFileNameはrepeat with i…で繰り返すたびに「USA 94」「USA 94 12」「USA 94 12 01」と変化していく。いいかな? 分かったかね。
はいっ。あっ、もう1つありました。" "で挟まれた半角スペースがありますけど、これも何か意味があるんですよねっ?
先生
あぁそうか。説明するのを忘れていたんだが、これはね、前にも出てきたダイアログのメッセージにもあったよね。
えぇ、そう言えば付いていました。
先生
この半角の引用符は、その間に書かれたものがstring、つまり文字列だということを示している。
先ほどの「リスト」もそうなんだが、この「文字列」というのもAppleScriptで扱うことができるデータの一種でね「これは命令じゃないよ、文字としてのデータですよ」ということを意味しているんだ。
で?
先生
詳しくは、また改めて説明するつもりだが、これは英語や日本語といったいわゆる文字でなくても、数字でも記号でもスペースだって構わない。だからさっきの引用符で囲まれた半角スペースは「そこに半角のスペースを入れなさい」ということになる。 だいたい分かったような気がします。

TOP

AppleScript救急隊事務局(ASQs) info-asqs@fsight.co.jp

主催 株式会社フォーサイト   後援 アップルコンピュータ株式会社

(c)1996-2010 The ForeSight Inc. All rights reserved.Appleは、米国アップルコンピュータ社の登録商標です。
AppleScriptは、米国アップルコンピュータ社の商標です。
その他記載の会社名・製品名・ソフトウェア名は一般にその会社の登録商標または商標です。