[AppleScript] ファイルの拡張子を変更するドロップレットを作成する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ドロップレット

ドロップレットとは、そのアイコンにファイルやフォルダをドラッグ&ドロップしてある処理を実行するアプリケーションのことです。

AppleScript では簡単にドロップレットを作成することができます。
今回はファイルの拡張子を変更するドロップレットを作成してみました。
順に解説していきます。

サンプルコード

on open objects
    display dialog "extenxtion:" default answer ""
    set extension to text returned of result

    tell application "Finder"
        repeat with obj in objects
            set AppleScript's text item delimiters to "."
            set nameElements to every text item of (name of obj as string)
            set lastElementIndex to count nameElements
            set (item lastElementIndex of nameElements) to extension

            try
                set (name of obj) to (nameElements as string)
            on error
                display dialog "error"
            end try
        end repeat
    end tell
end open

こちらがそのコードです。
ファイルフォーマットを アプリケーション として保存すれば、ドロップレットの完成です。
あるファイル(複数可)を、作成したアプリケーションアイコンにドラッグ&ドロップすると、以下のダイアログが表示されます。

1

ここで任意の拡張子を入力すると、ドラッグ&ドロップしたファイルの拡張子が入力したものに変わります。

解説

on open objects
    repeat with obj in objects
        -- 略
    end repeat
end open

これがドロップレットの形式です。
on open xxxxx をファイルの先頭に書くと、repeat with obj in xxxxx 内でドラッグ&ドロップされたオブジェクトの各要素に対して操作を実行できます。
xxxxx の部分には任意の文字列を指定することができます。


display dialog "extenxtion:" default answer ""
set extension to text returned of result

ここで拡張子を入力させるダイアログを表示しています。
入力した文字列は text returned of result に格納されるので、それを extension という変数に代入しています。


set AppleScript's text item delimiters to "."

ここで素晴らしいものが出てきました。
AppleScript's text item delimiters です。

AppleScript では以下のような命令が存在します。

  • every text item of <文字列>
    • <文字列> を設定された文字列ごと分断し、リストに変換する
  • <リスト> as string
    • <リスト> の各要素を設定された文字列で連結し、一つの文字列に変換する

ここでいう 設定された文字列 というのが AppleScript's text item delimiters なのです。

例えば、AppleScript's text item delimiters を : と設定し

every text item of "11:22:33:44"

を実行した場合、この結果は

{"11", "22", "33", "44"}

となります。
また、この後 AppleScript's text item delimiters を - と設定し

{"11", "22", "33", "44"} as string

を実行すると、結果は

11-22-33-44

となります。

非常に便利なものなので覚えておきましょう。
なお、AppleScript's text item delimiters のデフォルト値は です。

サンプルコードでは . を設定しています。


set nameElements to every text item of (name of obj as string)

ドロップされたファイルのファイル名を . で分断してリストに変換し、nameElements という変数に代入しています。


set lastElementIndex to count nameElements
set (item lastElementIndex of nameElements) to extension

生成したリストの最終要素を入力された拡張子に上書きしています。
ファイル名に複数の . が含まれている場合を考慮して、このような作りにしてみました。


try
    set (name of obj) to (nameElements as string)
on error
    display dialog "error"
end try

ファイル名の変更を行っています。
同名のファイルが存在する場合やファイル名が長すぎる場合などはエラーとなります。

さいごに

簡単ですが、ドロップレットの説明でした。
AppleScript's text item delimiters はとても便利なので覚えておきましょう。
ファイルに対する決まった操作などはドロップレットを利用して自動化するとよさそうですね。

一方ロシアは

シェルスクリプトを使った。

for filename in ./*.*; do mv $filename ${filename%.*}.extension; done

拡張子を変更したいファイルがあるディレクトリに移動してこのコマンドを実行すると、拡張子が extension となります。
extension 部分は自由に変更してください。

リンク

ミレニアム・ファルコン製作日記 #46

46 号 表紙

mfd_46_1

パーツ

mfd_46_2

mfd_46_3

mfd_46_4

成果

mfd_46_5

今回の作業は以下の 7 つでした。

  • パーツを集める
  • フレームワークを支える
  • 最初の外殻プレートを取り付ける
  • 最初の 1/4 を完成させる
  • 半円を完成させる
  • 機関室エリアを準備する
  • 下部外殻プレートの 1 層目を完成させる

今回取り付けたパーツはこちらです。

mfd_46_6

計 24 枚、多い。

「フレームワークを支える」の作業では 4 本のボルトを仮のスタンドとして外殻フレームに取り付けることが指示されました。
組立作業ではフレームを何度も裏返すため、デリケートな搭乗ランプの装置を保護することが目的です。
ですが、このボルトは自前で用意する必要があり、私は持っていなかったため息子の遊び道具であるトラのサッカーボールで代用しています。
ボルトは近々 Amazon で注文します。

今回の作業で、保管していた外殻プレートのほとんどが本体に取り付けられたので、収納スペースに余裕ができました。
これは良いこと。

作業時間はこれまでで最長、2 時間ほどかかりました。
少し疲れましたがとても楽しかったです。

スター・ウォーズ 反乱者たち シーズン 3

いよいよ今週の日曜日 12/11 13:00 より、反乱者たちのシーズン 3 が始まります。
エズラの成長した姿を期待しましょう。
次週はローグ・ワンが公開されたりと、スター・ウォーズブームが再燃してまいりました!

スター・ウォーズ 反乱者たち シーズン 3

それではまた次回。

May the Force be with you!