AppleScriptDroplet

[AppleScript]ドロップレットの作法を考える その6 (ドロップレットを途中終了させる)

ドロップレットでちょっと困るのが
途中で処理をキャンセルさせる事
Xcodeでアプリケーションを作る場合には
「プログレスバー」を出せば途中キャンセルも可能ですが
AppleSxript単体だとチョイ難しかったりします。

そこで
こんな風に考えてみました

Website_image20130114_145601
 
 
上記の図で言う
stop2dropletについては
内包して配布する事で解決出来ます
 
 
Website_image20130114_145625

 
 
元のアプリケーションからは
シェルを使ってオープンします
 
 

Website_image20130114_150132
 
 
 


------------------------------------------------■■■■ ダブルクリックの始まり
on run
------------------------------------------------ダイアログを出して選択されたファイルは「open」に渡す
open (choose file)
end run

----------------------------------------------■■■■ openドロップの始まり
on open DropObj

-----------------------------------------------キャンセル用の別アプリを起動する
----実行したアプリケーションのパスを求めて
set theMyPath to path to current application as string
----キャンセル用swf2img.appのパスを加えて
set theStopAppPath to theMyPath & "Contents:Assistants:stop2droplet.app" as Unicode text
-----UNIXパスに整形
set theStopAppPosPath to POSIX path of theStopAppPath
--------コマンドラインを整形
set theKillPsComLine to "open " & theStopAppPosPath as text
-----キャンセル用のアプリを開く
do shell script theKillPsComLine


repeat

------ここに本処理
delay 20
end repeat
end open

 
 
 

 

処理を中断させるために
呼び出す別アプリ

 
  
Website_image20130114_150518
 
 
 



-------対象になるアプリケーション
set theNameOfApp to "OpenStopDroplet.app"


display alert ¬
"実行中のドロップレットをキャンセルします" message ¬
"ドロップレットが終了したら閉じてください" buttons {"ドロップレットを中止する", "このウィンドを閉じる"} ¬
default button 1 as informational

--------ダイアログの実行結果で処理を分岐
if button returned of the result is "このウィンドを閉じる" then
--------ウィンドを閉じるを選択した場合は何もしない
else if button returned of the result is "ドロップレットを中止する" then
-------------プロセスIDを取得するコマンドラインの整形
set theComLine to "ps -A | grep -v grep | grep " & quoted form of theNameOfApp & " | grep '/droplet' | awk '{print($1)}'" as text
-------------コマンドの実行
set thePsId to do shell script theComLine as text
-------------プロセスIDを取得できたか?で処理を分岐
if thePsId is "" then
-----プロセスIDを取得出来なかったら何もしない
else
--------取得したプロセスIDでコマンドラインを整形
set theKillPsComLine to "kill " & quoted form of thePsId as text
--------プロセスの終了を実行
do shell script theKillPsComLine
end if
end if


 

 

「OpenStopDroplet.app.zip」をダウンロード
「OpenStopDroplet.rtf」をダウンロード

 
 

 
「stop2droplet.app.zip」をダウンロード
「stop2droplet.rtf」をダウンロード


 


|

[AppleScript]ドロップレットの作法を考える その5 (エイリアスの処理に悩む)

その1で書いたように
on run で選んだファイル(フォルダでも良いが)は
書類情報 info forの結果等から、不要なファイルへの排他が出来る

Website_image20130108_00339

一方
ドロップされたファイル(フォルダ)については
こちらの記事で書いたように
『エイリアス』の処理が悩ましい

Website_image20130108_02728


そこで
最初に考えたのが
ドロップされたディレクトリで判断するもの

Website_image20130108_05542

 

考えたが
Macではこのようなファイルの選択が可能で
違うディレクトリからドロップする事が可能だ


Website_image20130108_05410

じゃぁ
ファイルを別に集めてから処理すれば?

Website_image20130108_10649


って
方法があるが
処理時間や
処理後のファイルと
元ファイルが2重になるので
ファイル数が多い処理の場合は
利用者に利点より面倒が多い

さ〜困った


|

[AppleScript]ドロップレットの作法を考える その4 (ドロップされたファイルはエイリアスか?)

ドロップレット形式のAppleScriptsは
on openで処理がはじまるので
エイリアスがドロップされると
エイリアスを『オープン』する
その結果
エイリアスの参照先である
『実体』を「オープン」するから
ドロップされたファイルが
「エイリアス」

「ファイル」

はドロップレットに限っては判定出来ない。

『エイリアス』に対して処理が必要な場合は
ドロップレットは向かない

昔からこの動作だったかな?

Website_image20130106_163514


こちらの記事で書いたが
Finder内でエイリアスのinfoを要求すると

Website_image20130106_164921

このように
-10004エラーになる
Finder以外からファイル情報は呼び出すようにした方が良いかもしれない


Website_image20130106_165122


|

[AppleScripts]ドロップレットの作法を考える その3 エラーログを作成する

その2でダイアログによるエラー通知を組み込みましたが
必要か?は微妙wですが
ログをファイルにする事を考えてみました。

Website_image20130106_72652
 
 

 
 

------------------------------------------------■■■■ ダブルクリック起動の始まり
on run
------------------------------------------------【設定項目】ファイル選択ダイアログのデフォルトのディレクトリ
---set theDefLoc to path to shared documents from user domain
set theDefLoc to POSIX file "/Users/Shared/Downloads"
------------------------------------------------【設定項目】Uniform Type Identifier指定
------------------------------------------------詳しくは http://goo.gl/6jAQa Uniform Type Identifierを見てください
set theFileType to "public.png,public.jpeg" as text
---簡素の記述も出来ますPDFの場合---set theFileType to "PDF" as text
---ムービーファイルの場合---set theFileType to "public.movie,com.adobe.flash-video" as text
------------------------------------------------のファイルタイプをリスト形式に整形する
set AppleScript's text item delimiters to {","}
set theFileTypeList to every text item of theFileType
------------------------------------------------【設定項目】プロンプトの文言改行が使えます\nを入れます
------------------------------------------------Uniform Type Identifierとメッセージ
set theWithPrompt to theFileType & "\nファイルをえらんでください\n"
------------------------------------------------残りのメッセージ
set theWithPromptMes to "ファイルをドロップしても\n動作します"
------------------------------------------------ダイアログを出して選択されたファイルは「open」に渡す
open (choose file default location theDefLoc ¬
with prompt theWithPrompt & theWithPromptMes ¬
of type theFileTypeList ¬
invisibles true ¬
with multiple selections allowed without showing package contents)
end run



----------------------------------------------■■■■ openドロップ起動の始まり
on open theDropObj
----------------------------------------------IF文でエラー処理が無かった(正常終了)した場合の終了メッセージ
set theErrorPlaceMes to "処理が終了しました" as text
----------------------------------------------ログファイル名=アプリケーション名にするためにアプリケーション名を取得
set theApplicationName to name of current application as string
----------------------------------------------ログファイルの名前に日付時間を使うために今の時間を整形する
set theDateTime to (do shell script "date +'%Y%m%d_%H_%M_%S'" as string)
set theLogFileName to (theApplicationName & "_" & theDateTime & ".txt") as text
---------------------------------------------ファインダーを呼び出す
tell application "Finder"
----------------------------------------------■■■■ 繰り返しの始まり
repeat with theObjFiles in theDropObj
----------------------------------------------処理1
try
-----------------------◆◆◆ここに処理1
-----------------------エラーサンプル用のerror number -10004になる処理(これはOn Errorにならないので処理を中断しない)
do shell script "touch /tmp/test1.txt"
----------------------------------------------最初にメッセージを書き込む
my theLogEvent("\nこのファイルは削除しても大丈夫です\n\n", "処理1は正常終了しました", theLogFileName)


on error theErrorMsg number theErrorNum
----------------------------------------------【設定項目】ここの処理でエラーになった場合のエラーコード
set theErrorPlaceMes to "Er0001"
----------------------------------------------エラーの内容をログにかき出すサブルーチンを呼び出す
my theLogEvent(theErrorPlaceMes & ":" & theErrorMsg & ":" & theErrorNum, theLogFileName)
----------------------------------------------ダイアログを出してユーザーに知らせる
activate
display dialog (theErrorMsg & "" & theErrorNum & "\n" & "メールで↓のメッセージをお伝え下さい") ¬
default answer (theErrorPlaceMes & "" & theErrorMsg & "" & theErrorNum) ¬
with icon 1 default button 2
----------------------------------------------最後のダイアログ用にメッセージを整形
set theErrorPlaceMes to "エラーが発生して処理を中断しました:" & theErrorPlaceMes
end try
----------------------------------------------処理2
try
-----◆◆◆ここに処理2
-----------------------エラーサンプル用のerror number 1エラーになる処理
tell current application
do shell script "rm /tmp/test2.txt"
end tell



on error theErrorMsg number theErrorNum
----------------------------------------------【設定項目】ここの処理でエラーになった場合のエラーコード
set theErrorPlaceMes to "Er0002"
----------------------------------------------エラーの内容をログにかき出すサブルーチンを呼び出す
my theLogEvent("", theErrorPlaceMes & ":" & theErrorMsg & ":" & theErrorNum, theLogFileName)
----------------------------------------------ログファイルのあるフォルダを開く
open (folder "AppleScripts" of folder "Logs" of (path to library folder from user domain))
----------------------------------------------ダイアログを出してユーザーに知らせる
activate
display dialog (theErrorMsg & "" & theErrorNum & "\n" & "メールで↓のメッセージをお伝え下さい") ¬
default answer (theErrorPlaceMes & "" & theErrorMsg & "" & theErrorNum) ¬
with icon 1 default button 2
----------------------------------------------最後のダイアログ用にメッセージを整形
set theErrorPlaceMes to "エラーが発生して処理を中断しました:" & theErrorPlaceMes
end try
end repeat
----------------------------------------------処理終了ダイアログ 自動終了する
activate
display alert theErrorPlaceMes message "" as informational giving up after 1
end tell
end open



----------------------------------------------■■■■ログファイル書き込みのサブルーチン
on theLogEvent(theFirstMessage, theLogMessage, theLogFile)
----------------------------------------------ログファイルの格納先ディレクトリを作成
-----------既にフォルダがあるとnumber -48でエラーになる
try
tell application "Finder"
make new folder at folder "Logs" of (path to library folder from user domain) with properties {name:"AppleScripts"}
end tell
end try
-----------の処理が好みでは無い場合はdo shell script の方がスマート
------do shell script "mkdir -p ~/Library/Logs/AppleScripts"
----------------------------------------------ログファイルを作る
-----------既にファイルがあるとnumber -48でエラーになる
try
tell application "Finder"
make new file at (folder "AppleScripts" of folder "Logs" of (path to library folder from user domain)) with properties {name:theLogFile}
end tell
end try
-----------の処理が好みでは無い場合はdo shell script の方がスマート
------do shell script "touch -f ~/Library/Logs/AppleScripts/" & quoted form of (theLogFile)
----------------------------------------------利用者が削除して良いか?を判断出来るようにファイルを作っておく
------------既にファイルがあるとnumber -48でエラーになる
try
tell application "Finder"
make new file at (folder "AppleScripts" of folder "Logs" of (path to library folder from user domain)) with properties {name:"_このフォルダは削除しても大丈夫です.txt"}
end tell
end try
-----------の処理が好みでは無い場合はdo shell script の方がスマート
------do shell script "touch -f ~/Library/Logs/AppleScripts/" & "_このフォルダは削除しても大丈夫です.txt"
----------------------------------------------最初にメッセージを書き込む
do shell script "echo " & quoted form of (theFirstMessage & "\n") & " >> ~/Library/Logs/AppleScripts/" & quoted form of (theLogFile)
----------------------------------------------ログを書き込む
do shell script "echo " & quoted form of (theLogMessage & "\n") & " >> ~/Library/Logs/AppleScripts/" & quoted form of (theLogFile)
end theLogEvent


 
 
 

「log.app.zip」をダウンロード

「log.scpt.zip」をダウンロード

「log.rtf」をダウンロード

|

[AppleScripts]ドロップレットの作法を考える その2 on error

環境の違い等でエラーになった場合に備えるのが
エラー制御

エラーが発生するのを前提に考えるわけですが
「考え過ぎ」は
スクリプトが複雑になったり、処理が重くなったりと
弊害もあるので
「案配」や「程度」も大事ですね。

ドロップレットでの処理の場合
スクリプトエディタ上で実行するように
イベントログやエラーメッセージを確認しにくい
そこをなんとかしたい


Website_image20130106_02308


ポイントは
◆エラーが発生した箇所が特定出来る事
◆エラーの内容を取得出来る事


------------------------------------------------■■■■ ダブルクリック起動の始まり
on run
------------------------------------------------【設定項目】ファイル選択ダイアログのデフォルトのディレクトリ
---set theDefLoc to path to shared documents from user domain
set theDefLoc to POSIX file "/Users/Shared/Downloads"
------------------------------------------------【設定項目】Uniform Type Identifier指定
------------------------------------------------詳しくは http://goo.gl/6jAQa Uniform Type Identifierを見てください
set theFileType to "public.png,public.jpeg" as text
---簡素の記述も出来ますPDFの場合---set theFileType to "PDF" as text
---ムービーファイルの場合---set theFileType to "public.movie,com.adobe.flash-video" as text
------------------------------------------------のファイルタイプをリスト形式に整形する
set AppleScript's text item delimiters to {","}
set theFileTypeList to every text item of theFileType
------------------------------------------------【設定項目】プロンプトの文言改行が使えます\nを入れます
------------------------------------------------Uniform Type Identifierとメッセージ
set theWithPrompt to theFileType & "\nファイルをえらんでください\n"
------------------------------------------------残りのメッセージ
set theWithPromptMes to "ファイルをドロップしても\n動作します"
------------------------------------------------ダイアログを出して選択されたファイルは「open」に渡す
open (choose file default location theDefLoc ¬
with prompt theWithPrompt & theWithPromptMes ¬
of type theFileTypeList ¬
invisibles true ¬
with multiple selections allowed without showing package contents)
end run



----------------------------------------------■■■■ openドロップ起動の始まり
on open theDropObj
----------------------------------------------IF文でエラー処理が無かった(正常終了)した場合の終了メッセージ
set theErrorPlaceMes to "処理が終了しました" as text
tell application "Finder"
----------------------------------------------■■■■ 繰り返しの始まり
repeat with theObjFiles in theDropObj
----------------------------------------------処理1
try
-----------------------◆◆◆ここに処理1
-----------------------エラーサンプル用のerror number -10004になる処理(これはOn Errorにならないので処理を中断しない)
do shell script "touch /tmp/test1.txt"


on error theErrorMsg number theErrorNum
----------------------------------------------【設定項目】ここの処理でエラーになった場合のエラーコード
set theErrorPlaceMes to "Er0001"
----------------------------------------------ダイアログを出してユーザーに知らせる
activate
display dialog (theErrorMsg & "" & theErrorNum & "\n" & "メールで↓のメッセージをお伝え下さい") ¬
default answer (theErrorPlaceMes & "" & theErrorMsg & "" & theErrorNum) ¬
with icon 1 default button 2
----------------------------------------------最後のダイアログ用にメッセージを整形
set theErrorPlaceMes to "エラーが発生して処理を中断しました:" & theErrorPlaceMes
end try
----------------------------------------------処理2
try
-----◆◆◆ここに処理2
-----------------------エラーサンプル用のerror number 1エラーになる処理
tell current application
do shell script "rm /tmp/test2.txt"
end tell



on error theErrorMsg number theErrorNum
----------------------------------------------【設定項目】ここの処理でエラーになった場合のエラーコード
set theErrorPlaceMes to "Er0002"
----------------------------------------------ダイアログを出してユーザーに知らせる
activate
display dialog (theErrorMsg & "" & theErrorNum & "\n" & "メールで↓のメッセージをお伝え下さい") ¬
default answer (theErrorPlaceMes & "" & theErrorMsg & "" & theErrorNum) ¬
with icon 1 default button 2
----------------------------------------------最後のダイアログ用にメッセージを整形
set theErrorPlaceMes to "エラーが発生して処理を中断しました:" & theErrorPlaceMes
end try
end repeat
----------------------------------------------処理終了ダイアログ 自動終了する
activate
display alert theErrorPlaceMes message "" as informational giving up after 1
end tell
end open

 

  
「error.app.zip」をダウンロード

「error.rtf」をダウンロード


「error_scpt.zip」をダウンロード


処理中のエラーの場合は
display alertでは無くdisplay dialogを使う事で
エラーコード等をコピー出来るようにしています。


Website_image20130106_63239


|

[AppleScripts]ドロップレットの作法を考える その1 open (choose file)

ちょっとAppleScriptのドロップレット作ってくれ!と頼まれたので
AppleScriptsのドロップレット形式のAppファイルの作法を考えてみました。

Force4ucocologniftycom_20130105_02


こんな感じで
ダブルクリックでもドロップでも
動作する方法にして提供した。
この方法だと
スクリプトメニュー(メニューバーのアレね)

Website_image20130105_145832

からも呼び出せるので
デスクトップ等にも配置しなくて良いのわけなので
利用者の使い方(好みの問題)も選べるから
良いなぁと…
ちょっとひと手間かけてみた


ポイントは

1:of type を指定して処理の対象になるファイルタイプを選択させる

ぐらいでしょうか?
 
 
 
open (choose file)で選択されたファイルは
open theDropObjに渡されて
theDropObjに格納(定義?)されるって事になります。

 
 
 

------------------------------------------------■■■■ ダブルクリック起動の始まり
on run
------------------------------------------------【設定項目】ファイル選択ダイアログのデフォルトのディレクトリ
---set theDefLoc to path to shared documents from user domain
set theDefLoc to POSIX file "/Users/Shared/Downloads"
------------------------------------------------【設定項目】Uniform Type Identifier指定
------------------------------------------------詳しくは http://goo.gl/6jAQa Uniform Type Identifierを見てください
---png jpg画像ファイルの場合---set theFileType to "public.png,public.jpeg" as text
---簡素の記述も出来ますPDFの場合---set theFileType to "PDF" as text
set theFileType to "public.movie,com.adobe.flash-video" as text
------------------------------------------------のファイルタイプをリスト形式に整形する
set AppleScript's text item delimiters to {","}
set theFileTypeList to every text item of theFileType
------------------------------------------------【設定項目】プロンプトの文言改行が使えます\nを入れます
------------------------------------------------Uniform Type Identifierとメッセージ
set theWithPrompt to theFileType & "\nファイルをえらんでください\n"
------------------------------------------------残りのメッセージ
set theWithPromptMes to "ファイルをドロップしても\n動作します"
------------------------------------------------ダイアログを出して選択されたファイルは「open」に渡す
open (choose file default location theDefLoc ¬
with prompt theWithPrompt & theWithPromptMes ¬
of type theFileTypeList ¬
invisibles true ¬
with multiple selections allowed without showing package contents)
end run



----------------------------------------------■■■■ openドロップ起動の始まり
on open theDropObj
tell application "Finder"
----------------------------------------------■■■■ 繰り返しの始まり
repeat with theObjFiles in theDropObj


-------ここに本処理


end repeat
end tell
end open


「on_run.app.zip」をダウンロード


↑のスクリプト
「on_run.scpt.zip」をダウンロード


「on_run.rtf」をダウンロード

|

その他のカテゴリー

Accessibility | AccessibilityCheck | AccessibilityForm | AccessibilityInDesign | AccessibilityPDF | Acrobat | Acrobat Action | Acrobat Annotation | Acrobat AppleScript | Acrobat Layer | Acrobat Plug-ins | Acrobat Portfolios | Acrobat Print | AcrobatBarcode | AcrobatDialog | AcrobatForm | AcrobatJS | AcrobatMenu | AcrobatPDF | AcrobatStamp | AcrobatX | AcrobatYouTube | AddressBook | Adobe | Adobe InDesign | AdobeAppleScript | AdobeBridge | AdobeIllustrator | AdobeJSX | aed | Alfresco | Android | AnimationGif | Apple | AppleScript | AppleScriptBasics | AppleScriptCharacter | AppleScriptColor | AppleScriptDroplet | AppleScriptErrorNum | AppleScriptFolder | AppleScriptRename | AppleScriptTools | AppleSymbols | Applications | Barcode | Barcode2D | BarcodePostal | BetterHTMLExport | Book | Browser | buzz | CAD | Certificates | CharacterEntity | CharacterSets | Chrome | Colors | Cool Site | CriminalMind | CSS | Cutting | DecoMail | DecorationMail | Design | Desktop | Diff | DJ | dmg | DNS | Documents | Download | DTP | eBook | Editer | eMail | Envelopes | ExifTool | Facebook | FFmpeg | File System | Fonts | FontsTool | FontsWeb | FOOD | FormPrint | ftp | Gadget | Gif Animation | glee | Google | Graphic | HexEditor | HTML | info | iPhoto | ISBN | ISO | iTunes | iWork | iWorkNumbers | iWorkNumbersCalendar | iWorkNumbersTimecard | iWorkPages | JavaScript | JeditX | JeditX Regexp | JeditXAppleScript | JIS | jquery | Kanji | Kids | Letterpress | Library | logo | Mac Admin | Mac Archiver | Mac Browser | Mac Browser Plugin | Mac QuickLook | Mac Spotlight | Mac Video | Map | Mobby | Moto | Movies | Music | Network Basic | ntp | OCR | OCR Font | Office | OfficePowerPoint | OSX | Pantone | Paper | PDFlib | Permission | Photo | Pictograms | Pictures | Press | Print | Printing | Public | QuickLook | QuickTime | QuickTimeSetting | QuickTimeSound | Real Media | ReName | ResourceFork | ruby | Sample | Screen | ScreenCast | Search | Security | SEO | Sharing | Sign | SLAResource | Sound | Souvenir | Spotlight | Stamp | SWF | Tutorial PSD | TV | Twitter | Typography | Unicode | Utilities | Video | WebClip | WebFont | Wedding | Windows | WindowsMedia | XML | XMP | XPS | YouTube | YouTube Rss