Top / AppleScript

Finder Scripts

[1] [2] [3] [4] [5]

AppleScriptでは、2つの-から行末まではコメントで、そこはプログラムの実行には関係なくて無視されます。C言語などのように複数行に渡るコメントもできて、(*と*)で挟み込めばいいです。緑色で示したところは勝手な変数名なので好きな名前に変更しても大丈夫です。

●新規フォルダ作成

新規フォルダを作成するのは、tell application "Finder"とend tellの間にmake folder at desktop with properties {name:"フォルダ名"}などと書くだけでできます。ここではフォルダ名に日付を指定するなどといったことでスクリプトが長くなっています。私は自分のMacでない別のMacで作業するときに、こういった日付のフォルダを作って散らかさないようにしてます。

実を言うと、以下のスクリプトの日時の扱い方には問題があって、環境によっては意図したようには動かない可能性があります。というのは、日付が「2000年 12月 3日」のような感じで表すように設定されていると仮定していて、そのためword 1 of theDateで「2000」といった年の部分、word 2 of theDateで「年」、word 3 of theDateで「12」といった月の部分、などという風に表現できています。自分の環境に合わせてwordの次の数字を換えたり、より環境に依存しない year of (current date) のような書き方にしてもいいでしょう。

set theDate to (current date) as string -- 今の日付と時刻の文字列がtheDateに得られる
set theName to word 1 of theDate & "." & word 3 of theDate & "." & word 5 of theDate -- theDateの内容 (文字列) を加工して、「2000.12.3」といった形式に
tell application "Finder"
    set theFolder to make folder at desktop with properties {name:theName} -- with properties以降を省略すれば「名称未設定フォルダ」とかいった名前になる
    open theFolder -- フォルダを開く
    -- open folder theName of desktop
    set view of theFolder to name -- フォルダを名前順のリスト表示に
    -- set view of folder theName of desktop to name
end tell

●新規ファイル作成 (テキスト)

基本的に新規フォルダの作成と同様で、make fileとfolderをfileに換えるだけですね。その日のニュースとか日記とかを整理するフォルダに、こういった日付の名前のファイルで入れておくといいかな。

set theDate to (current date) as string -- 今の日付と時刻の文字列がtheDateに得られる
set theMonth to word 3 of theDate as number
set theDay to word 5 of theDate as number
if theMonth < 10 then set theMonth to "0" & theMonth -- 一桁の月の頭に0を付ける
-- set theMonth to characters -2 thru -1 of ("0" & theMonth as string) -- 頭に0を付けて末尾2文字を取得
if theDay < 10 then set theDay to "0" & theDay -- 一桁の日にちの頭に0を付ける
set theDate to word 1 of theDate & theMonth & theDay
set theName to theDate & ".txt" -- 「20001204.txt」といった形式の文字列に 
tell application "Finder" to make file at desktop with properties {name:theName}
-- 1つの文の場合はtellとend tellで挟み込まずに、上のように書くこともできる

●フォルダの指定

上の例ではデスクトップ(・フォルダ)に作成されるようになっていました。:や/で区切った絶対パスやpath toと標準フォルダ名などを利用して、デスクトップ以外にも特定のフォルダを指定することもできますが、ここでは実行時に新規ファイル作成場所のフォルダを指定するようにしました。これだと空のファイルが作成されるだけですが、何らかの定型ファイルが作成させるようにすると (新規ファイルに書き込んでもいいですけど、ひな形 (テンプレート) フォルダみたいなのを用意しておいてそこからコピーしたりするとか) より役立つものになるかもしれません。

コメントになっているスクリプトのあるフォルダを指定というのは、同じフォルダにスクリプトで読み込むデータファイルや別のソフトウェアのプログラムファイルがある、つまりよく変更するデータ部分なんかはスクリプトに入れないで、別ファイルにしておくという場合に役立つと思います。特にMac OS XでPerlなどを利用する場合にMacPerl (MacJPerl) のドロップレットに代わる1つの方法でしょう。

set theName to "MyDoc.txt"
tell application "Finder"
    set theFolder to choose folder with prompt "どこに新規ファイルを作成しますか?"
    -- 上の代わりに以下のようにすると、このスクリプトのあるフォルダになる(アプリケーション形式で保存して実行)
    -- (スクリプト編集プログラムで開いた状態で実行するとスクリプト編集プログラムのあるフォルダになる)
    -- set theFolder to container of (path to me)
    -- set theFolder to ":" as alias
    set theFile to make file at theFolder with properties {name:theName}
    set creator type of theFile to "MMKE"
    -- クリエータの変更,「MMKE」はmiのクリエータコード,SimpleTextであれば「ttxt」
end tell

●新規ファイル作成を繰り返す

以下の場合は空のファイルを作成するだけですが、共通部分の多い複数のファイルを編集するといったときに、先にそれらファイルを作成しておいて、ラベルやファイル名の一部、アイコンなどで未完の印となるようなものを付けて作業すると、間違いとか防げるかもしれません。

set aName to "MyDoc"
tell application "Finder"
    set theFolder to choose folder with prompt "どこに新規ファイルを作成しますか?"
    repeat with addStr in {"い", "ろ", "は"}
        set aFile to make file at theFolder with properties {name:aName & addStr & ".txt"}
        set creator type of aFile to "MMKE"
    end repeat
end tell

連番のファイル名にする場合は例えば次のようにするといいでしょう。

set aName to "MyDoc"
tell application "Finder"
    set theFolder to choose folder with prompt "どこに新規ファイルを作成しますか?"
    set startNum to 7
    set finishNum to 12
    set numWidth to length of (finishNum as string) -- 桁数の少ない数字の頭に0を付けるため
    repeat with num from startNum to finishNum -- startNumからfinishNumまでの連番
        set numText to "00000" & num as string
        set numLen to length of numText
        set addStr to (characters (numLen - numWidth + 1) thru numLen of numText) as string
        set aFile to make file at theFolder with properties {name:aName & addStr & ".txt"}
        set creator type of aFile to "MMKE"
    end repeat
end tell

●新規フォルダ作成を繰り返す

日付名で整理していなかったものを、日付名のフォルダなどに分けて整理し直すといったときに役立つかもしれません。そういう場合はさらにフォルダに入れる作業を追加するとか、何か変換するといったプログラムと組み合わせないとあまり役立たないかな。

-- startDayからfinishDayまでの日付名のフォルダを作成
-- 日付の入力では年月日を半角スペースで区切ってください(例 2001 2 3)
display dialog "startDayを入力して下さい" default answer "2001 2 3" buttons {"OK"} default button 1
set startDay to text returned of result -- resultの代わりに上の行を丸括弧で囲んだのを書いてもいい
set startDay to date startDay
display dialog "finishDayを入力して下さい" default answer "2001 4 5" buttons {"OK"} default button 1
set finishDay to text returned of result
set finishDay to date finishDay
display dialog "日数の間隔を入力して下さい。" default answer "7" buttons {"OK"} default button 1
set addDay to text returned of result as number -- as integer でもいい
set aDay to startDay
set dayNames to {}
repeat -- リスト (日付のリスト) を作成(一気にフォルダの作成までしてもいいけど)
    set aDate to aDay as string
    set aName to (word 1 of aDate & "." & word 3 of aDate & "." & word 5 of aDate)
    set dayNames to (dayNames & aName) as list -- リストに項目 (日付) を追加
    -- set end of dayNames to aName
    set aDay to aDay + addDay * days -- addDay日後の日付を次に処理する
    if (finishDay - aDay) < 0 then exit repeat -- それがfinishDayの日付を越えていたらループを出る
    -- この代わりに上のrepeatのところを repeat until (finishDay - aDay) < 0 と書いてもいい
end repeat
tell application "Finder"
    set theFolder to choose folder with prompt "どこに新規フォルダを作成しますか?"
    repeat with aName in dayNames -- リストの項目名 (日付) でフォルダを作成
        make folder at theFolder with properties {name:aName}
        -- 上のプロパティのリストの項目にlabel index: 3などと追加してラベルの指定とかもできる
        -- 当然、上の文のmake folderをmake fileとすればフォルダでなく、ファイルが作成され
        -- 一つ上のスクリプトと基本的に同じことがわかるでしょう
    end repeat
end tell

上のは同じ階層に複数のフォルダを作成しましたが、作成したフォルダの中にマトリョーシカのように多重のフォルダを作成することもできます。プログラムを作るときにあるところにフォルダが無ければ新規作成するといったようにする代わりに、こういった感じで最初に使うフォルダを作成しておくと、存在の確認をせずにプログラミングできていいかもしれません。少し発展させてテキストフォルダの各行を読み込んで多数の多重構造のフォルダを作成するようにすると、自分好みのフォルダ階層を別のMacにすばやく構築するなんていう場合に役立つかな。

set dirStr to "レーニン:スターリン:ゴルバチョフ:エリツィン:プーチン:"
set tmpDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to ":"
set dirNames to every text item of dirStr
set AppleScript's text item delimiters to tmpDelim
tell application "Finder"
    set curFolder to choose folder with prompt "どこに新規フォルダを作成しますか?"
    repeat with aName in dirNames
        if aName as string is "" then exit repeat
        set newFolder to make folder at curFolder with properties {name:aName}
        set curFolder to newFolder
    end repeat
end tell

●新規フォルダ作成とその中へのファイル作成を繰り返す

単にフォルダとファイルの作成を組み合わせただけです。以下のスクリプトのコメントになっている文をアンコメントする (コメントでなくする) と選択したファイルやフォルダを新規フォルダの中へコピー (複製) します。

いくつかのフォルダに分けて整理するとき、共通部分を共通ファイルにまとめておくと、そのファイル書き換えることで変更が全体に反映されるという利点がありますが、個別のフォルダだけコピーして別のところにもっていく場合にちょっと注意しないと必要ファイルが足りないということになり得ますよね。必要ファイルはこんな感じで各フォルダごとに入れて個別のフォルダだけで完結 (パッケージ化) した方が便利なこともあると思います。

set dirNames to {"trivia", "applescript", "perl"}
set regFiles to {"index.html", ".css"}
tell application "Finder"
    -- set theItemsSelected to selection -- エラーになる場合 selection as alias list とすればいいかも
    set theFolder to choose folder with prompt "どこに新規作成しますか?"
    repeat with dirName in dirNames
        set aFolder to make folder at theFolder with properties {name:dirName}
        repeat with regName in regFiles -- regFilesの新規ファイル (テキスト) を作成
            if first character of regName is "." then set regName to (dirName & regName) as string
            set aFile to make file at aFolder with properties {name:regName, label index:4}
            set creator type of aFile to "MMKE"
        end repeat
        -- repeat with anItemSelected in theItemsSelected -- theItemsSelectedのファイルやフォルダを作成
        --     duplicate anItemSelected to aFolder without replacing
        -- end repeat
    end repeat
end tell

Top / AppleScript