Yosemite पर स्विच करने के बाद से AppleScript "देरी" कमांड काम नहीं कर रहा है


10

नोट:delay OS X 10.11 El Capitan में समस्या के साथ तय किया गया था।

जब से मैंने योसेमाइट में अपग्रेड किया है, देरी का उपयोग करने वाले एप्लिप्स ने काम करना बंद कर दिया है। मैं इसे कैसे ठीक करूं?

यहां एक आसान उदाहरण के लिए, दुनिया का सबसे सरल एप्सस्क्रिप्ट है:

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 सेकंड का समय लगना चाहिए। यदि मैं इसे स्क्रिप्ट एडिटर (पूर्व में एप्लास्क्रिप्ट एडिटर) में चलाता हूं, तो इसे पूरा होने में 30 सेकंड लगते हैं। लेकिन अगर मैं इस स्क्रिप्ट को एक ऐप के रूप में सहेजता हूं, जब मैं ऐप लॉन्च करता हूं, तो देरी को नजरअंदाज कर दिया जाता है और ऐप को पूरा होने में एक सेकंड का एक हिस्सा लगता है।

अगले चरण पर जाने से पहले मैं एप्सस्क्रिप्ट को किसी निर्दिष्ट समय के लिए विलंब करने के लिए कैसे मजबूर कर सकता हूं? क्या यह एक योसेमाइट गड़बड़ है? क्या कोई विश्वसनीय समाधान है?


यह मेरे मैक (10.10.1) पर अपेक्षित के रूप में काम करता है
10

किसी भी विचार के कारण यह मेरा काम नहीं करता है? स्पष्ट करने के लिए: यह स्क्रिप्ट एडिटर में काम करता है, लेकिन अगर मैं स्क्रिप्ट को ऐप के रूप में सहेजता हूं और फिर ऐप लॉन्च करता हूं, तो देरी को नजरअंदाज कर दिया जाता है। यह सबसे अजीब बात है।
2oh1

मुझे १०.१०.३ पर वही समस्या है
थॉमस

Apple को रिपोर्ट किया गया: Openradar.me/21588747
थॉमस टेम्प्लेमन

1
यह मुद्दा OS X 10.11 El Capitan में तय किया गया था।
क्रिस पेज

जवाबों:


7

नोट:delay OS X 10.11 El Capitan में समस्या के साथ तय किया गया था।

@ 2oh1, आपके पास अपने उत्तर में सही मूल विचार है, लेकिन यहाँ एक पूर्ण और सही उत्तर है:

इसके चारों ओर काम करने का एकमात्र उचित तरीका एक लूप के भीतर "देरी" को लागू करना है जो जारी रखने से पहले वांछित अवधि को सुनिश्चित करता है। ऐसा करने का सबसे अच्छा तरीका एक कस्टम हैंडलर के साथ "देरी" को ओवरराइड करना है:

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!"

[नोट: आम तौर पर, कस्टम हैंडलर बिल्ट-इन "देरी" को लागू करने के लिए "जारी रखने की अवधि" का उपयोग करेगा, लेकिन मैंने पाया कि, हालांकि यह स्क्रिप्ट एडिटर के भीतर काम करता है, यह एक एपलेट ("कैन ') के भीतर इस्तेमाल होने पर एक त्रुटि देता है। t विलंब जारी रखें। (-1708) ")। मैंने उस मुद्दे के चारों ओर काम किया ताकि सीधे AppleScript को देरी आदेश को संभालने के लिए "जारी" का उपयोग करने के बजाय वहां पहुंचने के लिए कह सके।]

मुद्दा यह है कि delayस्क्रिप्ट को रोकते समय उपयोगकर्ता इनपुट को संसाधित करता है, इसलिए आप अभी भी एक एप्लेट द्वारा प्रदर्शित मेनू या विंडो पर क्लिक कर सकते हैं, और एक बग (10.11 में तय किया गया है) जहां उपयोगकर्ता इनपुट delayस्क्रिप्ट को फिर से शुरू करने से पहले पूरी अवधि तक इंतजार नहीं करने का कारण बनता है। । यदि आप एप्लेट के साथ इंटरैक्ट नहीं करते हैं, तो delayसही तरीके से काम करता है।


क्या यह सब बग है, या योसेमाइट के साथ इस तरह से काम करने में देरी की वजह है?
2oh1

यह एक बग है जो देरी में देरी नहीं कर रहा है।
क्रिस पेज

यह काफी आश्चर्यजनक है। मैं एक एप्सस्क्रिप्ट के साथ छेड़छाड़ कर रहा था जो दूसरी रात में देरी का उपयोग करता है, और अचानक, देरी फिर से सही ढंग से काम कर रही थी। मुझे लगा कि बग को ठीक कर दिया गया है। एक घंटे बाद, भले ही कुछ भी नहीं बदला था, बग वापस आ गया था। मैं वास्तव में चकित हूँ। हालांकि यह कोई फर्क नहीं पड़ता। मैं पांच मिनट बाद (उदाहरण के लिए) समय और देरी सेट करने के लिए एक चर का उपयोग कर रहा हूं, और यह पूरी तरह से काम कर रहा है। इसलिए ... समस्या हल हो गई, लेकिन यह नहीं बताता कि समस्या क्यों मौजूद है। दिलचस्प, दिलचस्प, दिलचस्प।
2oh1

1
क्योंकि Apple नासमझ था। Apple सॉफ़्टवेयर बहुत कम विश्वसनीय है क्योंकि उन्होंने वार्षिक रूप से OS X जारी करना शुरू किया था। मुझे उच्च OS X के लघु संस्करण याद आते हैं (जैसे 10.6.8) जहां OS रॉक-सॉलिड था। आपको अभी उस तरह का अनुभव नहीं मिला है।
विलियम टी फ्रूगार्ड

अगर यह एक बग (जो मैं सहमत हूं), तो यह अभी भी तय नहीं है, मुझे आश्चर्य है। क्या यहां किसी ने राडार रिपोर्ट बनाई है? क्या आप कृपया इसकी आईडी पोस्ट करेंगे? (या / भी Openradar.me पर पोस्ट करें)
थॉमस

5

इसी समस्या से जूझते हुए मैं इस सवाल के जवाब में आया था कि यह एक गैर-संबंधित प्रश्न है और इसे आजमाने का फैसला किया और यह मेरे लिए काम करने लगता है।

बस के delay 5साथ बदलें do shell script "/bin/sleep 5"और एक ही परिणाम प्राप्त करें।


साझा करने के लिए धन्यवाद! जैसा कि मैंने पहले कहा था, मैं इसका परीक्षण करने में असमर्थ हूं, क्योंकि जिन कारणों से मुझे कोई मतलब नहीं है, देरी 5 के लिए काम कर रहा है क्योंकि यह अभी मेरे लिए होना चाहिए (मैंने अभी एक पल पहले फिर से परीक्षण किया है)। मुझे नहीं पता कि यह कभी-कभी क्यों काम करता है और कभी-कभी विफल हो जाता है। यह काफी आश्चर्यजनक है। मैंने एक वर्कअराउंड का उपयोग करके समाप्त किया, जहां मुझे वर्तमान समय मिलता है और इसे एक चर के रूप में सेट किया जाता है, और फिर स्क्रिप्ट को तब तक रोकें जब तक कि समय चर एक मिनट (1 मिनट की देरी के लिए, जाहिर है)। यह क्लूनी है, लेकिन इसने महीनों तक बिना सोचे-समझे काम किया है, जबकि एक साधारण देरी रुक-रुक कर हुई है। ओह।
2oh1

मैं १०.१०.५ चला रहा हूं और यह समाधान काम नहीं करता है और नींद की अवधि के लिए स्क्रिप्ट को लॉक भी करता है
ग्रेग

@Greg: यदि यह नींद की अवधि के लिए "स्क्रिप्ट को लॉक करता है", तो यह काम कर रहा है। /bin/sleepनींद की अवधि की प्रतीक्षा करता है और जब तक यह पूरा नहीं होता है तब तक वापस नहीं आता है। इसके विपरीत, AppleScript की अंतर्निहित delayकमांड उपयोगकर्ता इनपुट घटनाओं को संभालती है जबकि स्क्रिप्ट को रोक दिया जाता है। (यह वह जगह है जहां बग निहित है: यदि उपयोगकर्ता कीबोर्ड इनपुट है, delayतो देरी की अवधि पूरी होने से पहले स्क्रिप्ट निष्पादन जारी है।)
क्रिस पेज

3

मैं यह नहीं कह रहा हूं कि यह सबसे अच्छा समाधान है, लेकिन ऐसा लगता है कि मेरी समस्या हल हो गई है। एक साधारण देरी का उपयोग करने के बजाय, जिसे उन कारणों के लिए नजरअंदाज किया जा रहा है जिन्हें मैं नहीं समझता, मैंने समय प्राप्त करने और एक नया समय पूरा होने तक लूप करने के लिए स्विच किया है (यह अभी भी देरी का उपयोग करता है, लेकिन इससे कोई फर्क नहीं पड़ता कि यह उपेक्षा करता है स्क्रिप्ट में देरी तब तक नहीं होती जब तक समय पूरा नहीं हो जाता)।

# 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

मैं अभी भी यह जानने के लिए मर रहा हूं कि देरी को क्यों नजरअंदाज किया जा रहा है (या नाटकीय रूप से फैलाया गया है?!?), लेकिन इससे काम हो जाता है, जैसा कि यह अनाड़ी है।


"देरी" कमांड "स्पेड अप" नहीं है, यह बाधित हो रहा है। विलंब करते समय, यह लूप चेकिंग में बैठता है कि क्या कोई कीबोर्ड इनपुट ईवेंट हैं ताकि यह कमांड-पीरियड के लिए जांच कर सके। जाहिरा तौर पर यह किसी भी उपयोगकर्ता इनपुट का पता चलने पर विलंब लूप से गलत तरीके से बाहर निकल रहा है।
क्रिस पेज

दिलचस्प! मुझे पता चल रहा है कि इसे अनदेखा किया जा रहा है (बाधित; बाधित?) यहां तक ​​कि जब मेरा मैक बेकार बैठा है, लेकिन मुझे नहीं पता कि क्यों।
2oh1

एक बार जब उपयोगकर्ता इनपुट ईवेंट ईवेंट कतार में होता है, delayतब तक बाधित होता रहेगा जब तक कि कुछ ईवेंट को हैंडल नहीं करता और उन्हें कतार से निकाल नहीं देता।
क्रिस पेज

2

मुझे एक जर्मन फोरम पोस्ट में एक काम के आसपास मिला । इन पंक्तियों को अपनी स्क्रिप्ट के शीर्ष पर जोड़ें:

use framework "Foundation"
use scripting additions
current application's NSThread's sleepForTimeInterval:1

मुझे आपके उत्तर का परीक्षण करने में परेशानी हो रही है, क्योंकि जो भी कारण से, विलंब वर्तमान में मेरे मैक पर अपेक्षित रूप से काम कर रहा है। मुझे कोई जानकारी नहीं है की क्यों। मैं 10.10.3 चला रहा हूं। शायद Apple ने इस बग को ठीक किया? या, शायद यह सिर्फ एक आंतरायिक समस्या है जो इस समय मेरे मैक को प्रभावित नहीं कर रही है। ओह। जैसा कि मैंने ऊपर कहा, हालांकि, मेरे वर्कअराउंड में करंटस्क्रिप्ट को वर्तमान समय मिलता है और फिर वर्तमान समय प्लस x तक देरी होती है।
2oh1

मैं १०.१०.३ चला रहा हूं और अभी भी इस मुद्दे को देखता हूं। चूंकि हर कोई इस मुद्दे को नहीं देखता है, इसलिए यह शायद इंटरमिटेंड है या 3 डी सॉफ्टवेयर से संबंधित है या कुछ वरीयता सेटिंग्स से संबंधित है। कौन जाने। BTW, आपके काम के आस-पास का नुकसान शायद यह है कि ऐप प्रतीक्षा करते समय 100% CPU समय का उपयोग करता है, जबकि उचित विलंब व्यवहार के लिए ऐप को उस अवधि के लिए सोने के लिए रखा जाता है, जिससे कम शक्ति का उपयोग होता है।
थॉमस टेम्प्लेमन

मैं 10.10.5 पर चल रहा हूं और यह समाधान काम नहीं करता है।
ग्रेग

@ThomasTempelmann: उपयोगकर्ता इनपुट होने पर समस्या होती है। यदि आप स्क्रिप्ट के चलने के दौरान क्लिक या टाइप नहीं करते हैं, तो बग ट्रिगर नहीं होता है।
क्रिस पेज

ध्यान दें कि यह समाधान वास्तव में नींद की अवधि के लिए फ्रीज करने का कारण बनता है। delayउपयोगकर्ता इनपुट को संसाधित करता है जबकि स्क्रिप्ट रोक दी जाती है, इसलिए आप अभी भी मेनू और विंडोज़ के साथ बातचीत कर सकते हैं, उदाहरण के लिए।
क्रिस पेज

0

carzyj के पास मैं सबसे अच्छा उत्तर देने पर क्या विचार करता हूं, लेकिन जब क्रिस पेज की विधि के साथ जोड़ दिया जाता है, तो आप प्राप्त करते हैं:

on delay duration
  do shell script "/bin/sleep " & duration
end delay

आप मूल विलंब में वापस आने के लिए "अंतिम विलंब" के माध्यम से "देरी पर" टिप्पणी कर सकते हैं।


मैंने इसे देखने से पहले एक समान कोड संशोधन भी किया। मैं 10.10.5 पर चल रहा हूं और यह समाधान काम नहीं करता है और नींद की अवधि के लिए स्क्रिप्ट को भी लॉक करता है।
ग्रेग

0

यह @ क्रिस पेज समाधान के लिए एक संशोधन है

यह जवाबदेही और सटीक रूप से देरी को पकड़ने के बीच एक संतुलन प्रतीत होता है।

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

लेकिन समग्र अवधि में देरी के लिए अप्प्लीस्क्रिप्ट बताने के बजाय, हम इसे केवल अवधि के एक आंशिक अवधि के लिए देरी करने के लिए कहते हैं। यदि अवधि सेब से कम (1/60 सेकंड का) की अनुमति देता है, तो चलो इसे उस डेल्टा पर सेट करते हैं। कि हम कुछ जवाबदेही रख सकते हैं, फिर भी सटीक हो सकते हैं। संदेह यह है कि कभी-कभी देरी काम नहीं करती है इसलिए लूप दोहराते समय थ्रेड को बंद रखा जाएगा, लेकिन सफलता के परिदृश्य में, हम चाहते हैं कि देरी डेल्टा कम हो ताकि प्रक्रिया अभी भी बाधित हो सके


अनुरोधित देरी को कम करना अनावश्यक है और केवल स्क्रिप्ट को धीमा कर सकता है और प्रतीक्षा करते समय अधिक सीपीयू का उपभोग कर सकता है। मेरा संस्करण केवल तब तक देरी को कॉल करता है जब तक कि पूरी वांछित अवधि समाप्त नहीं हो जाती है, delayनिष्पादन को जारी रखने से पहले जितनी देरी हो सकती है।
क्रिस पेज

ध्यान दें कि जब से यह उत्तर पोस्ट किया गया था, मैंने delay endTime - (current date)इसके बजाय उपयोग करने के लिए अपने कोड को अपडेट किया delay duration, जो यह सुनिश्चित करता है कि यदि बाधित delay नहीं होता है तो यह मूल रूप से अनुरोध किए गए समय की तुलना में किसी भी समय स्क्रिप्ट को रोक नहीं पाएगा, जो आप के लिए कोशिश कर रहे थे। इस जवाब के साथ पता।
क्रिस पेज 3

0

इसलिए, यह सब एक साथ करने के लिए, मेरा मानना ​​है कि क्रिस का मतलब है:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.