に切り替えたため、AppleScriptの「delay」コマンドが機能しない注: delay
の問題はOSX 10.11 ElCapitanで修正されました。
Yosemiteにアップグレードして以来、遅延を使用するApplescriptは機能しなくなりました。 。どうすればこれを修正できますか?
簡単な例として、これが世界で最も単純なApplescriptです:
set volume output volume 0 delay 5 set volume output volume 20 delay 5 set volume output volume 0 delay 5 set volume output volume 20 delay 5 set volume output volume 0 delay 5 set volume output volume 20 delay 5 set volume output volume 0
完了するまでに30秒かかります。 Script Editor(以前のApplescript Editor)で実行すると、完了するまでに30秒かかります。しかし、このスクリプトをアプリとして保存すると、アプリを起動したときに遅延が無視され、アプリが完了するまでに数分の1秒かかります。
Applescriptを指定された時間だけ遅延させるにはどうすればよいですか。次のステップに進む前に?これはヨセミテのグリッチですか?信頼できる回避策はありますか?
コメント
- これは私のMac(10.10.1)で期待どおりに機能します
- 任意のアイデア何が原因でそれが私のもので機能しないのですか?明確にするために:スクリプトエディターで機能しますが、スクリプトをアプリとして保存してからアプリを起動すると、遅延は無視されます。 ‘最も奇妙なことです。
- 10.10.3でも同じ問題が発生します
- Appleに報告: openradar.me/21588747
- この問題は、OS X 10.11 ElCapitanで修正されました。
回答
注: はOSX 10.11 ElCapitanで修正されました。
@ 2oh1、あなたの答えには正しい基本的な考え方がありますが、ここに完全で正しい答えがあります:
これを回避する唯一の合理的な方法は、ループ内で「delay」を呼び出して、続行する前に目的の期間が経過するようにすることです。これを行う最善の方法は、カスタムハンドラーで「delay」をオーバーライドすることです。
on delay duration set endTime to (current date) + duration repeat while (current date) is less than endTime tell AppleScript to delay endTime - (current date) end repeat end delay
これにより、スクリプトの残りの部分を変更せずにそのままにして、通常どおり「遅延」を使用できます。例:
delay 5 display alert "I like cake!"
[注:通常、カスタムハンドラーは「継続遅延期間」を使用して呼び出します組み込みの「遅延」ですが、これはスクリプトエディタ内では機能しますが、アプレット内で使用するとエラーが返されることがわかりました(「遅延を続行できません。 (-1708)」)。 「continue」を使用してそこに到達する代わりに、遅延コマンドを処理するようにAppleScriptに直接指示することで、この問題を回避しました。]
問題は、delay
がユーザーを処理することです。スクリプトの一時停止中に入力するため、アプレットによって表示されるメニューまたはウィンドウをクリックできます。ユーザー入力によってdelay
が待機しないというバグ(10.11で修正)があります。スクリプトの実行を再開する前の完全な期間。アプレットを操作しない場合、delay
は正しく機能します。
コメント
- すべてですこのバグの、または遅延がYosemiteでこのように機能している理由はありますか?
- 遅延が’遅延しないのはバグです。
- ‘とても奇妙です。先日、遅延を使用するアプレットをいじっていましたが、突然、遅延が再び正しく機能しました。バグは修正されたと思います。 。1時間後、何も変更されていなくても、バグが再発しました。私は’本当に困惑しています。’は問題ではありません。 。私は’変数を使用して時間と遅延を5分後まで設定し(たとえば)、’は完全に機能しています。だから…問題は解決しましたが、’問題が存在する理由を説明していません。興味深い、興味深い、興味深い。
- Appleが騙されたため。AppleソフトウェアはOSXを毎年リリースし始めて以来、信頼性がはるかに低くなっています。 OSが堅実だった上位のOSXマイナーバージョン(10.6.8など)が恋しいです。 ‘そのような経験はもう得られません。
- バグの場合’(同意します) with)、なぜこれがまだ修正されていないのか’だろうか。ここで誰かがレーダーレポートを作成しましたか?それでは、そのIDを投稿していただけませんか。 (または/またはopenradar.meにも投稿してください)
回答
この同じ問題と戦っているときに、私はこの回答はあまり関係のない質問に対するもので、試してみることにしました。
delay 5
をdo shell script "/bin/sleep 5"
に置き換えても、同じ結果が得られます。
コメント
- 共有していただきありがとうございます!上で述べたように、’これをテストすることはできません。理由がわからないため、現在、遅延5が正常に機能しているためです(テストしたばかりです)。少し前にもう一度)。なぜこれが時々機能し、時々失敗するのか私にはわかりません。’はとても奇妙です。最終的に、現在の時刻を取得して変数として設定し、時刻が変数に1分を加えた値になるまでスクリプトを一時停止するという回避策を使用しました(明らかに1分の遅延)。 ‘は不格好ですが、’は数か月間問題なく機能しましたが、単純な遅延は断続的でした。うーん。
- 10.10.5を実行していますが、このソリューションは機能せず、スリープ中もスクリプトをロックします
- @Greg:「スクリプトをロック」する場合スリープ期間、その後’が機能します。
/bin/sleep
はスリープ期間を待機し、スリープが完了するまで戻りません。対照的に、AppleScript ‘の組み込みのdelay
コマンドは、スクリプトが一時停止している間、ユーザー入力イベントを処理します。 (バグの原因は次のとおりです。ユーザーのキーボード入力がある場合、delay
は、遅延時間が完了する前にスクリプトの実行を続行します。)
回答
これが最善の解決策だとは言いませんが、問題は解決したようです。無視されている単純な遅延を使用する代わりに理解できない理由で、時間の取得と新しい時間に達するまでループするように切り替えました(それでも遅延を使用しますが、スクリプトは次のようになるまで続行されないため、遅延を無視してもかまいません。時間に達しました。
# Pause for five minutes set GetTheTime to current date set NewTime to GetTheTime + (5 * minutes) repeat while (current date) is less than NewTime delay 60 end repeat
遅延が無視されている(または劇的に高速化されている)理由を知りたくありませんが、これは仕事は完了しましたが、そのままでは不器用です。
コメント
- “遅延”コマンドが’高速化されていない” ” 、it ‘が中断されています。遅延している間、キーボード入力イベントがあるかどうかをチェックするループにとどまり、Command-Periodをチェックできます。どうやら、ユーザー入力が検出されたときに、遅延ループを誤って終了しているようです。
- 興味深い! ‘ Macがアイドル状態のときでも、’が無視されている(高速化されている?中断されている?)ことがわかりましたが、 ‘理由がわかりません。
- ユーザー入力イベントがイベントキューに入ると、
delay
は続行されます。何かがイベントを処理してキューから削除するまで中断されます。
回答
仕事を見つけました-ドイツ語のフォーラムの投稿で。スクリプトの先頭に次の行を追加します。
use framework "Foundation" use scripting additions current application"s NSThread"s sleepForTimeInterval:1
コメント
- I ‘現在、なんらかの理由でMacで遅延が期待どおりに機能しているため、回答のテストに問題があります。理由がわかりません。私は’ 10.10.3を実行しています。おそらくAppleはこのバグを修正しましたか?または、’は、現時点ではMacに影響を与えていない’断続的な問題である可能性があります。うーん。上で述べたように、私の回避策は、Applescriptに現在の時刻を取得させてから、現在の時刻にxを加えたものまで遅らせることです。
- 10.10.3も実行していますが、まだ問題が発生しています。誰もが問題を認識しているわけではないため、’はおそらく断続的であるか、サードパーティのソフトウェアまたは特定の設定に関連しています。知るか。ところで、回避策には、アプリが待機中に100%のCPU時間を使用し続けるという欠点がありますが、適切な遅延動作は、アプリをその時間スリープ状態にして、消費電力を減らすことです。
- 10.10.5を実行していますが、このソリューションは機能しません。
- @ThomasTempelmann:この問題は、ユーザー入力がある場合に発生します。スクリプトの実行中に’クリックまたは入力しないと、バグは’トリガーされません。
- このソリューションでは、スリープ中にアプリケーションが実際にフリーズすることに注意してください。
delay
は、スクリプトが一時停止している間もユーザー入力を処理するため、たとえばメニューやウィンドウを操作できます。
回答
carzyjは私が最良の答えだと思うものを持っていましたが、Chris Pageの方法と組み合わせると、次のようになります。
on delay duration do shell script "/bin/sleep " & duration end delay
「ondelay」から「enddelay」までコメントアウトして、元の遅延に戻すことができます。
コメント
- Iまた、これを確認する前に、同様のコード変更を行いました。10.10.5を実行していますが、このソリューションは機能せず、スリープ中はスクリプトをロックします。
回答
これは@ chris-pageソリューションの変更です
応答性と遅延の正確なキャプチャのバランスのようです。
on delay duration set endTime to (current date) + duration repeat while (current date) is less than endTime set delta to duration / 100 if duration < 0.2 then set delta to 0.2 end if tell AppleScript to delay delta end repeat end delay
ただし、Applescriptに全体の期間を遅らせるように指示する代わりに、期間の一部の期間だけ遅らせるように指示します。期間がアップルの許容範囲(1/60秒)よりも短い場合は、そのデルタに設定します。ある程度の応答性を維持しながら、正確さを保つことができます。遅延が発生しない場合があるのではないかと疑われます。 whileループを繰り返すとスレッドがロックされたままになるように機能しますが、成功シナリオでは、プロセスを中断できるように遅延デルタを短くする必要があります
コメント
- 要求された遅延を短縮することは不要であり、スクリプトの実行を遅くし、待機中により多くのCPUを消費するだけです。私のバージョンでは、必要な期間全体が経過するまで遅延を呼び出すだけなので、
delay
は、実行を続行する前に可能な限り遅延させることができます。 - この回答以降、投稿されたので、
delay duration
の代わりにdelay endTime - (current date)
を使用するようにコードを更新しました。これにより、delay
‘ t が中断されることはありません’最初に要求された時間より長くスクリプトを一時停止することはありません、この回答で対処しようとしていた可能性があります。
回答
つまり、すべてをまとめると、クリスはこれを意味すると思います:
on delay duration set endTime to (current date) + duration repeat while (current date) is less than endTime tell AppleScript to delay endTime - (current date) end repeat end delay