連載[6-3] 今日はちょっと教科書的にお勉強
|
《 ファイルの名前を表示しようとするとエラーに
》
|
|
|
?
|
先生、もう1つエラーの例があるんですけど。choose fileでちゃんとファイルが選ばれているかをダイアログ・ボックスで確認するために、こんなスクリプトを書いてみたんです。 これを実行しようとすると、こんなエラーになってしまいます。 |
![]() |
|
|
先生
|
はは〜ん、よくある、よくある。ケアレス・ミスだぞ。コマンドのところでも言ったけど、プロパティー(属性)もそれぞれのアプリケーションに固有のものなんだ。 |
|
?
|
プロパティーと言いますと? |
|
|
ファイルの名前、つまりnameというプロパティーを取り出せるのはFinderなんだよ。だからtellステートメントでFinderをアプリケーションとして指定しなきゃならない。
set myFile to choose file
って書けばいい。 |
|
?
|
choose fileで得た結果から、直接nameを操作することはできないんですね。 |
|
先生
|
そう、choose fileは単なるスクリプティング機能追加コマンドで、ファイルやフォルダがクラス化されているわけではないんだ。それらをクラスとして体系化しているのはあくまでもFinderだから、name を操作したり,moveしたりする時には、Finderにtellする必要があるんだね。 |
|
《 実行中に文字を入力したい 》
|
|
|
?
|
あのう、もう1つ困ったことがあるんですけど。 |
|
先生
|
何だね。 |
|
?
|
スクリプトを実行中にキーボードから文字を入力してそれを変数に格納することはできないんでしょうか。 例えばユーザーに名前とかパスワードを入力させるとか、数字を指定するとかしたいですよね。 |
|
先生
|
これも実はdisplay dialogコマンドでできるんだよ。display dialogの修飾節として、default
answerというのが用意されている。この修飾節を付けた場合は、ダイアログの中にテキスト・ボックスが現れて来るんだ。 使い方は、 display dialog メッセージ default answer 取りあえずの入力 という感じ。 取りあえずの入力の中には、最初にテキスト・ボックスに入る文字列を書いておけばいい。 つまり、ユーザーに「まあ、それでいいや」って思わせるようなものとか、入力の仕方の見本とかだね。 例えば、 display dialog "読むものは何ですか?" default answer "新聞と雑誌" というような具合になる。 これを実行すると次のようにテキスト・ボックス付きのダイアログが表示される。 |
![]() |
|
|
?
|
ここでユーザーが文字を入力できるわけですね。入力した結果はスクリプト中ではどうなっているんですか。 |
|
先生
|
display dialogはReply型のオブジェクトを返してくる。 |
|
?
|
Reply型のオブジェクト? |
|
先生
|
まぁまぁそれは置いといて,その中のプロパティーとしてだね、
text returned というものがあるんだよ。これが入力された文字列を持っているんだ。まぁ、とにかく使ってみよう。 set myBirthday to (text returned of こんな風に書けば変数myBirthdayの中にテキスト・ボックスで入力された文字列が入ってくれる。これで解答になったかな。 |
|
《 応用編 》
|
|
|
?
|
今回のQ&Aで覚えたことを使って、何か役立ちそうなスクリプトを書いてみたいですね。 |
|
先生
|
よし、じゃあちょっと見せてあげよう。(別ウインドウ図1)テーマは、指定された日付よりも後に修正されたファイルやフォルダの名前を表示する。便利でしょ? よくそういうようなことが必要な状況ってあるからね。 |
|
?
|
実行すると、最初にフォルダを選ぶダイアログボックスが出てきて、その後に、日付を尋ねてきますね。 |
![]() |
|
|
先生
|
そうそう、先ほど教えたことの応用だね。
set theDate to date (text returned of (display dialog で、変数theDateにユーザーが入力した日付が入る。おっと、日付を入力する時は,コントロールパネルの「日付&時刻」で設定した書式でね。 |
|
?
|
dateというのは何ですか。 |
|
先生
|
これは、文字列から日付を指定するものなんだ。
date 日付を表す文字列 で文字列が日付型のデータに変換される。この日付の値には、時間も含まれているので、例えば「date "93.12.30"」なら「1993年12月30日午前0時0分0秒」というデータになる。 |
|
?
|
このスクリプトを実行すると、ダイアログ・ボックスが何度も表れて、指定した日付より後に修正されたファイルの名前が次々に表示されていきますね。 |
![]() |
|
|
先生
|
repeatステートメントですべてのファイルについて修正日をチェックしているからね。 ファイルやフォルダの修正日は、Finderのitemのプロパティー「modification date」で得られる。 |
|
?
|
すべてのファイルについて繰り返すと言っても、フォルダの中にフォルダがあった場合はどうなるんですか。 |
|
先生
|
子供のフォルダも、その孫フォルダの中にあるファイルも、すべて繰り返し対象になる。
entire contents of フォルダ名 というのがポイントだ。これはフォルダに対して用意されているプロパティーで、そのフォルダに含まれているすべてのファイルや フォルダの一覧をリストとして返してくる。これを使えば、階層構造になったフォルダの中のすべてのファイルに対して何か処理を行うスクリプトが簡単に書けるよね。 |
|
?
|
あれっ、すいません、先生。間違ってハード・ディスクを対象に選んじゃいました。 |
|
先生
|
おいおい、ハード・ディスク全体を選んでしまったらもう大変。全部のファイルを見に行ってしまうからね。 |
|
?
|
このまま永遠に続いちゃうんですか。 |
|
先生
|
さっき教えただろう。嫌になったらダイアログが出てきた時にキャンセルを押せば途中で中断できるよ。 |
AppleScript救急隊事務局(ASQs) info-asqs@fsight.co.jp