--
    --.--

    スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加
    2013
    05.17

    .DS_Store削除AppleScript(プロトタイプ)公開

    Category: Mac   Tags:MacAppleScriptDS_Store
    先日、アプリをハックした様子を公開しましたが、
    そんなことする必要が全く無かったことに気付きました(爆
    なのでその記事は削除します(汗
    関連記事も訂正しました。無知って怖い(^-^;



    気を取り直して、ずーっと出すと言っていた、.DS_Storeを削除するためのスクリプトをとりあえず公開します。
    これも同様のアプリが世に出回っていますので、大したものではありません。
    AppleScriptの処理の参考にでもなれば嬉しいです^-^

    一応 (1)指定フォルダ、(2)指定フォルダとその下の階層のフォルダ、(3)システム全体、と3種類の処理レベルを選べるようにしてみました。Drag & Drop、複数フォルダの同時処理に対応しています。
    調子が悪いフォルダだけ処理する時にお役に立てば幸いです^-^

    プログラムがイマイチかも知れませんが、素人に毛が生えたレベルですので、あまり虐めないでやって下さい(^-^;

    Open with ScriptEditorのボタンを押すか、表示されているソースコードをAppleScriptエディタにコピペして、アプリケーション形式で保存すればアプリとして使えます!

    「AppleScriptエディタ?何それ怖い。アプリよこせ」という方のために(笑)
    近いうちにRead me程度を付けたダウンロードファイルも用意します^-^

    2014.5.16追記:アプリの形でのダウンロードは当分で来そうにありませんm(_ _)m
    ホームページの開設時期が未定なので…


    (*
    .DS_Storeファイルを削除するAppleScript (プロトタイプ)
    OSX10.6.8で動作確認。

    処理の対象は(1)指定フォルダ、(2)指定フォルダとその下の階層のフォルダ、(3)システム全体の3種類です。基本的な機能は実装済みで、複数のフォルダをドロップしても処理できます。

    エラーが出て消去が出来ないときは処理をスルーする安全設計(笑)
    try~end tryでスキップしてるだけです)
    完成版ではオマケ機能を付け、よりシンプルなスクリプトにする予定です。
    *)


    --ダブルクリックで起動した時の一連の流れ
    on run
    tell application "Finder"
    activate
    set mifold to choose folder with prompt ".DS_Storeを消したいフォルダを選んで下さい"
    end tell
    set modetype to aSetMode() of me
    DSdeleteMain(mifold, modetype) of me
    end run


    --フォルダをドロップして起動した時(=ドロップレット)の一連の流れ
    on open dropitems
    set modetype to aSetMode() of me
    repeat with mifold in dropitems
    DSdeleteMain(mifold, modetype) of me
    end repeat
    end open


    --モード設定(choose from list)
    --choose from listの表記はこちらを参考にさせて頂きました。
    --http://d.hatena.ne.jp/sandai/20111103/p1

    on aSetMode()
    tell application "Finder"
    set modelist to {"1:指定フォルダだけ", "2:指定フォルダ+中のフォルダも一括処理", "3:システムすべての.DS_Storeを除去"}
    choose from list modelist default items "1:指定フォルダだけ" with prompt ".DS_Storeの削除レベルを指定して下さい】" with title "削除レベルの指定"

    if result is not false then
    --choose from listresultもリストなので、item 1として取り出す
    --長ったらしいresultはウザいので先頭の数字だけ取ってくる(気分の問題)
    set modetype to word 1 of item 1 of result as integer
    return modetype
    end if
    end tell
    end aSetMode


    --メイン処理
    on DSdeleteMain(mifold, modetype)
    tell application "Finder"
    if modetype = 1 then
    --.DS_Storeの有無を判定、無ければ処理しない
    set aDSMacPath to (mifold & ".DS_Store") as Unicode text

    if not (exists of file aDSMacPath) then
    display dialog "現在このフォルダには.DS_Storeは見当たりません。作業を終了します" with icon note
    else
    --ファイルがあるならPOSIX pathにキャストし直してrmコマンドで消す
    set aDSpath to quoted form of POSIX path of aDSMacPath
    try
    do shell script "rm " & aDSpath

    --shell scriptを使わない方法として以下のような方法もありますが、「ゴミ箱に移動」なのでイマイチ。
    --delete file aDSpath
    end try
    display dialog ".DS_Storeファイルを削除しました!" with icon note
    end if

    else if modetype = 2 then
    display dialog (class of mifold)
    set aFolderList to {}
    --aFolderListにメインフォルダ(mifold)のパスを入れる
    set end of aFolderList to mifold as alias
    --aFolderListにサブフォルダののパスを入れる
    set aFolderList to AllFolderListRecursive(mifold, aFolderList) of me

    --リストのパスすべてに処理を行う
    repeat with aFold in aFolderList
    set aDSMacPath to aFold & ".DS_Store" as Unicode text
    set aDSpath to quoted form of POSIX path of aDSMacPath
    try
    do shell script "rm " & aDSpath
    end try
    end repeat
    set aFoldName to name of item 1 of aFolderList as Unicode text
    display dialog aFoldName & "フォルダ以下の" & return & ".DS_Storeファイルを削除しました!" with icon note

    else if modetype = 3 then
    set aCommand to "sudo find / -name \".DS_Store\" -delete"
    display dialog "この処理には管理者権限が必要です。パスワードを入力して下さい" default answer "" buttons {"Cancel", "Set"} default button 2
    if result is not false then
    set inputPW to result as Unicode text
    end if
    try
    do shell script aCommand password inputPW with administrator privileges
    display dialog "すべての.DS_Storeを削除しました!"
    on error
    display dialog "エラーが発生したので操作を中止します"
    end try
    end if
    end tell
    end DSdeleteMain


    (*
    再帰処理ですべてのサブフォルダのパスをリストとして出力するハンドラ。
    処理するフォルダ=mifold
    再帰処理の関係でメインフォルダをリストに加える処理は入れておけないので
    こんな感じで前処理しておく。
    set aFolderList to {}
    set end of aFolderList to mifold as alias
    AllFolderListRecursive(mifold, aFolderList) of me
    *)

    on AllFolderListRecursive(mifold, aFolderList)
    tell application "Finder"
    try
    --mifoldの1つ下の階層のフォルダをfoldlistとしてリスト化し、aFolderListに追加
    set foldlist to {}
    set foldlist to every folder of mifold as alias list
    repeat with aFold in foldlist
    set the end of aFolderList to aFold
    end repeat
    end try

    --foldlist内のフォルダそれぞれについて、その中にフォルダがあれば再帰処理(=同じハンドラに再度渡して同じ処理をさせ、サブフォルダの情報をaFolderListに加え続ける)

    repeat with aFold in foldlist
    if (count folder of aFold) > 0 then
    AllFolderListRecursive(aFold, aFolderList) of me
    end if
    end repeat

    --aFolderListが出来上がったら出力
    return aFolderList
    end tell
    end AllFolderListRecursive
    関連記事

    このエントリーをはてなブックマークに追加
    トラックバックURL
    http://w6o6n.blog.fc2.com/tb.php/25-fb795401
    トラックバック
    コメント
    管理者にだけ表示を許可する
     
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。