>>4 なんか俺、ものすごく基本的なことで間違ってる? tell application "Finder" set a to "/User/xxxx/Desktop/" set POSIX file a open a end tell とすると開けないし、そもそもイベントログ見ても get POSIX file〜でエラー出てる。 POSIX fileの文字列は同様にして tell application "Finder" set a to selection as alias set a to POSIX path of a end tell で得た文字列なので間違いないと思うんだけど、、、、、、。
6 :
間違えました。 tell application "Finder" set a to "/User/xxxx/Desktop/" set a to POSIX file a ←この行 open a end tel でした。l
set a to POSIX file a を tell application "FInder" 内のままで tell me to set a to POSIX file a としてもおけ 他にもっとカッコいい書き方あるかな??
11 :
set a to a as POSIX file
12 :
それはカッコいいっ!ぐぬぬっw
13 :
fileキーワードの解釈が衝突してるんだろうね。my付けてglobalな定義優先すれば良い。 homeのパスも直書きせずこんな感じで。 tell application "Finder" set homePath to POSIX path of (home as alias) set aPath to homePath & "Desktop/" open my POSIX file aPath end tell
on awake from nib theObject tell theObject to register drag types {"file names"} end awake from nib on drop theObject drag info dragInfo set dataTypes to types of pasteboard of dragInfo if "file names" is in dataTypes then set preferred type of pasteboard of dragInfo to "file names" set theFiles to contents of pasteboard of dragInfo set theFiles to POSIX file theFiles tell application "Finder" set theFiles to theFiles as alias duplicate theFiles to desktop end tell end if return true end drop あーもうわからん。テーブルやBoxにドラッグアンドドロップしたら そのオブジェクトをデスクトップにコピーするスクリプトを初歩の初歩 としてサンプルスクリプトを参考にいじっているのだが、うまくいかんorz 上の例でなんとかコピーはされるのだが、なぜかたった数十字のテキスト ファイルでも20秒くらい時間がかかる。明らかにおかしい。でも どこが悪いかわからない。duplicateもtell "Finder"しなくてもいいような 気がするけど、こうじゃないとエラーを吐く。なんで???
18 :
Drag and Drop及びAppleScriptの処理(tell application) はアプリケーション間通信(AppleEvent)を通じで行なわれている Finderはアプリケーション間通信は1度には1つしか行なわない FinderからそのAppleScriptアプリへ通信中(on drop を抜けるまで)に、そのAppleScriptアプリからFinderと通信(tell application "FInder")を行なおうとするので、Drag and Dropの通信中なので止まる Drag and Dropの通信が時間切れになって、やっとこさduplicateが行なわれる てとこかなあ on drop で tell application "Finder" せずに、property に対象をセットし、on idle でそれをチェックして tell application "Finder" するとスムースに行くよ(1秒間隔のチェックなのでちょっと間があるけど) AppleScriptで遅延ハンドラ呼び出しってなんかあったかなあ
19 :
あと、 set theFiles to POSIX file theFiles って、地道に1個ずつ処理しなければなさげだけど? こんなんできんのかっ!と思ったけど、複数ドロップだとエラるようだけど
20 :
StandardAdditions のライブラリより > POSIX file n : A file object specified with a POSIX (slash)-style pathname そりゃそうだろうね あとdupulicateはFinderのcommandだから当然tellってないと無理
21 :
非常にキケンなコードができましたw ほかへの影響はまったく考慮なしw これ、実装してみようかなw 10ファイルくらいなら問題なさそうw on awake from nib theObject tell theObject to register drag types {"file names"} end awake from nib on drop theObject drag info dragInfo set dataTypes to types of pasteboard of dragInfo ignoring application responses ←危険な香り if "file names" is in dataTypes then set preferred type of pasteboard of dragInfo to "file names" set theFiles to contents of pasteboard of dragInfo set FileList to {} ←適当に複数ファイルも対応してみました repeat with aFile in theFiles set aFile to POSIX file aFile set end of FileList to aFile end repeat tell application "Finder" duplicate FileList to desktop end tell end if end ignoring return true end drop >>20 duplicateはFinderのコマンドというのはなんとなく分かるのですが、 自分が作ったアプリの用語辞書にはduplicateが載ってる。 それってつまり、もともとのテンプレートがduplicateに対応している のかな、と。
ちなみに、AppleEvent(をFinder)は一度には一つだけ処理しないけど、キューはあるから、どこどこメモ置いていっても構わないよ 例えば repeat with theItem in FileList duplicate theItem to desktop end repeat でも構わない(まあ、あんまりキューに貯めるのはよくないし、これだと、エフェクト音が煩いしw) なので特にそれだけでは危険というわけでもなく、単にエラー処理ができないってだけだね
>>21 確かにduplicateは載ってるね だけど比べてみると多少内容は違うみたい FinderのStandard Suite >duplicate v : Duplicate one or more object(s) >duplicate specifier : the object(s) to duplicate >[to location specifier] : the new location for the object(s) >[replacing boolean] : Specifies whether or not to replace items in the destination that have the same name as items being duplicated >[routing suppressed boolean] : Specifies whether or not to autoroute items (default is false). Only applies when copying to the system folder. >[exact copy boolean] : Specifies whether or not to copy permissions/ownership as is >→ specifier : to the duplicated object(s) Finder以外のStandard Suite >duplicate v : Copy object(s) and put the copies at a new location. >duplicate specifier : the object for the command >[to location specifier] : The location for the new object(s). >[with properties record] : Properties to be set in the new duplicated object(s). objectをコピーする点は変わりないのだけど、じゃあobject=fileとかの定義があんのかってーと、 自作アプリには無いんじゃね ちなみにSystem Eventsは後者でしかもfileやらfolderの定義もあるのでじゃあduplicateで複製出来るのか?と思ったら出来ないし その辺の理屈はよくわからん
26 :
ちょっと環境がないから分かりませんし、スレ違いかもしれませんが、ここで質問。 OS10.5でXcode3を使ってapplescriptでプログラミングしています。 OS10.4をターゲット?にしてコンパイルして10.5と10.4でプログラムを 動かしていました。しかし、10.5のほうは快調に動いていますが、 10.4でよく分からないのですが、特定の条件でエラーを吐きます。 Finder can't get Unknown objectとかなんとか。 実際にはDVDなどのメディアをFinder上から取得する動作で 詰まっているようです。 tell application "Finder" set DiskDVD to selection as alias end tell というようなことをしているのですが、いろんな種類のメディアで エラーになったりならなかったりします。考えたことは 続きます。
Mail.appで受信ボックスの未読メールを全て選択して.txtに書き出したいのですが、 「未読メールを全て選択」という所がどうやればいいのか分かりません。 check for new mail for account "accountname" keystroke "1" using {command down} こんな感じに、メールを受信して受信ボックスを開いたところまではできたのですが、未読メールを全て選択するにはどうすればいいでしょうか? .txtで書きだすのは、 System Eventを使って pick menu bar 1's menu bar item "ファイル"'s menu "ファイル"'s menu item "別名で保存..." delay 1 keystroke "UnreadMail" keystroke return こんな感じに書きました。
38 :
tell application "Mail" set MessageList to (every message of mailbox "INBOX" of account accountname whose read status is false) set theText to "" repeat with theMessage in MessageList set theText to theText & content of theMessage end repeat end tell みたいな感じで
Skypeでapplescriptの設定する方法教えてくれるかたいませんか? ID co-ca-co-la.jp
41 :
美人集め ※ワールド非対応 set BIJIN to "bijin" display dialog "エリアは" default answer "jp" set AREA to text returned of result display dialog "開始時間は" default answer "0000" set STARTTIME to text -4 thru -1 of ("0000" & text returned of result) display dialog "終了時間は" default answer "2359" set ENDTIME to text -4 thru -1 of ("0000" & text returned of result) set H to text 1 thru 2 of STARTTIME as number set M to text -2 thru -1 of STARTTIME as number tell application "Finder" set picFolder to folder "Pictures" of home set bijFolder to folder BIJIN of picFolder if not (exists bijFolder) then make new folder with properties {name:BIJIN} at defFolder if not (exists folder AREA of bijFolder) then make new folder with properties {name:AREA} at bijFolder end tell repeat set HH to text -2 thru -1 of ("0" & (H as text)) set MM to text -2 thru -1 of ("0" & (M as text)) set CURRENTTIME to HH & MM do shell script "curl -o ~/Pictures/" & BIJIN & "/" & AREA & "/" & CURRENTTIME & ".jpg -e http://bijint.com/jp/http://www.bijint.com/" & AREA & "/tokei_images/" & CURRENTTIME & ".jpg" if CURRENTTIME = ENDTIME then exit repeat set M to (M + 1) mod 60 if M = 0 then set H to (H + 1) mod 24 end repeat 自分の環境だと1日分で10分ちょい
ものすごく基本的なことなんだけどなにやらわからないので教えてくれ。 Xcodeでインターフェイスつけてデータを加工するのだが、毎回毎回繰り返す。 そのとき、前の変数の値を引きずらないように初期化的な処理をするんだが、 どうするのがいいのかよくわからない。 普通の文字列とかなら set a to "" とかすればいいと思うんだけど、ファイルやフォルダなんかを保持する変数の場合 上と同様でいいんでしょうか? 上と同じことをすると変数の型が変わってしまうような。 それから、defaultつーかplistつーかにレコードって保持できるんでしょうか? いまいちどうすればいいかわからない。 どなたかご回答を。
あるクラスのオブジェクトを指定するときにindexを使って以下のようなことができますが、 tell application "iTunes" set aSong to track index 1 of current playlist 逆にある曲の参照番号を知りたいときはどのようにすればいいのでしょうか? 具体的には、以下のようなことがしたいです。 set aTrackNo to |aSongの番号| set bTrackNo to |aTrackIDを加工| play track index bTrackNo of current playlist id of aSong は必ずしも表示順と一致しないので使えませんでした。 またiTunesでは、再生中のものとは異なるプレイリストを表示した状態だとpause中のnext trackが動作しないというバグ?があるようですが、GUIスクリプティング以外にこれをworkaroundする方法はあるでしょうか。 idを使う方法だとシャッフル時はうまくいきません。 長文になってしまいましたがご回答お待ちしております。
70 :
ちょっとやってみた tell application "iTunes" set theID to id of track 1 of current playlist end tell --ある曲が持つ固有の"ID"をtheIDに入れておく tell application "iTunes" set theList to id of tracks of current playlist repeat with i from 1 to count of theList if item i of theList is equal to theID then exit repeat end repeat i end tell --current playlistに含まれる曲のIDのリストを作り、そのリストの中でtheIDの位置を調べる current playlistの並び順は、その時のiTunesでの表示順になっているようです。
71 :
>>69 >またiTunesでは、再生中のものとは異なるプレイリストを表示した状態 iTunes自体がそういうものだからじゃないの。普通に使っていても current playlist に対してだから、current playlist にするために、play してすぐ pause するとか tell application "iTunes" set thePlaylist to playlist "Any playlist of any song"
try if thePlaylist is not current playlist then play thePlaylist pause end if on error play thePlaylist pause end try next track end tell try - on error は current playlist が現在存在していない(iTunes起動直後とか)場合のお
>>72 current playlist が現在見ている/表示している playlist ではないが、その current playlist 内での次の曲ってこと? play next track (必要ならすぐpause) よくわからないけど、play とすぐに pause を組み合わせればどうにでもなりそうだけど
74 :
>>69 曲を取得した時のプレイリストとインデックスを求めるプレイリストが同じなら index of aSong で取得できそうだけど
スマートではないんだけど set xxx to "AAA" set theVal to "{AAA:¥"あああ¥", BBB:¥"いいい¥", CCC:¥"ううう¥"}" set theScript to "get " & xxx & " of " & theVal as string run script theScript set yyy to result
84 :
AとBという対のリストならAのリストで一致した時のアイテム番号でBのリストの要素を指定するとか。
85 :
>>80 -- 対応する値を同じ順番で二つの変数へ入れる set listA to {"a", "b", "c"} set listB to {"あ", "い", "う"} set theVal to "b" -- これが決まった値とする set theNum to offset in (listA as text) of theVal set theResult to item theNum of listB return theResult スクリプト書いてから84と一緒だということに気付いた まあ、せっかくなので晒しとく
>>83の変形版というかrecordを実体で持つ場合 set theKey to "AAA" set theRecord to {AAA:"あああ", BBB:"いいい", CCC:"ううう"} run script "on run {theRecord} |" & theKey & "| of theRecord end run" with parameters {theRecord} recordの持ち方が違うだけなので速度的には同等 パイプは念の為に書いてるけどこの例なら無くても動きます
93 :
もいっちょ 殆ど一緒だけどちょっとだけ速い気がする set theKey to "AAA" set theRecord to {AAA:"あああ", BBB:"いいい", CCC:"ううう"} keyOfRecord(theRecord) of (run script "on keyOfRecord(theRecord) |" & theKey & "| of theRecord end keyOfRecord it") とまぁ書いておいてなんだけど… recordを使う方法は分量は短くなるけど、初見では何をやってるのか解り辛いかもね 2つのlistを使う方が内容的にはシンプル でもって速度的な面でも結局listの方が速いんじゃないかなという気が; いずれにしてもミリ秒以下の話だけども
94 :
もうレコードのキーを取り出すのはあきらめるというのはどうだろう。 set theRec to {{label1:"AAA",Label2:"あああ"},{label1:"BBB",Label2:"いいい"},{label1:"CCC",Label2:"ううう"}} set theKey to "AAA" repeat with i in theRec if label1 of i = theKey then set theResult to label2 of i end repeat 速度が早いかどうかは知りません。 ところでどなたかご存知なら。 フォルダtheFolderの中にあるファイルを取得する命令 set allFiles to every file of theFolder これとほぼ同じことをevery file ofを使わずに実現するにはどうすればいいんでしょう。 do script shell cat POSIX path of theFolder←すんません。知識がなく適当です。 とか call method 〜 とかそんな方法で。なぜか分からないのですが、特定のネットワーク上のフォルダについて every file of を使うとなぜか固まり、まったく原因がつかめないため、違う方法を 試してみたいのです。どなたかヒントを。
95 :
処理時間測定してみた。マシンは2GHz Core i7 素直なループ処理使う方が30倍速い。 (1) 0.65秒 set xxx to "CCC" set theVal to "{AAA:¥"あああ¥", BBB:¥"いいい¥", CCC:¥"ううう¥"}" repeat 1000 times set theScript to "get " & xxx & " of " & theVal as string run script theScript set yyy to result end repeat (2) 0.022秒 on getIndex(aItem, aList) set idx to 0 repeat with x in aList set idx to idx + 1 if (contents of x is aItem) then return idx end repeat return 0 end getIndex set listA to {"AAA", "BBB", "CCC"} set listB to {"あああ", "いいい", "ううう"} repeat 1000 times set yyy to item getIndex("CCC", listA) of listB end repeat
96 :
>>94 set theFiles to do shell script "cd " & quoted form of POSIX path of theFolder & " && /bin/ls -1 | while read item; do [ -f ¥"$item¥" ] && echo ¥"$item¥";done;exit 0" set saveDelimitters to text item delimiters of AppleScript set text item delimiters of AppleScript to return set theFiles to text items of theFiles set text item delimiters of AppleScript to saveDelimitters ¥ はバックスラッシュ
>>96 なんとか分かる部分だけ使って残りはapplescriptで書いて、get every file of 〜を置き換え、 同様にget name of 〜も do shell script "ruby -e \"puts File::basename(" & (POSIX path of theFolder)'s quoted form & ")\"" にすべて置き換えてみたところ、2分15秒かかっていた処理が、1分15秒になりました。 考えて見たら、get every file of とかしたあともいろいろファイル操作しているのですが、 それもUNIXのコマンドのオプションで対応できそう置き換えてみる予定です。 とても勉強になりました。ありがとうございます。