Az AppleScript „delay” parancs nem működik, mivel a Yosemite-re váltott

Megjegyzés: A (z) delay problémát kijavították az OS X 10.11 El Capitan rendszerben.

Amióta frissítettem a Yosemite-re, a késleltetést használó Applescriptek nem működnek . Hogyan tudom ezt kijavítani?

Itt egy egyszerű példa kedvéért a világ legegyszerűbb Applescriptje:

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 

Ennek 30 másodpercnek kell eltelnie. Ha a Script Editorban (korábban Applescript Editor) futtatom, akkor 30 másodpercet vesz igénybe. De ha ezt a szkriptet alkalmazásként mentem, amikor elindítom az alkalmazást, a késéseket figyelmen kívül hagyjuk, és az alkalmazás a másodperc töredékéig tart.

Hogyan kényszeríthetem az Applescriptet egy meghatározott összeg késleltetésére mielőtt áttérne a következő lépésre? Ez egy Yosemite-hiba? Van-e megbízható megoldás?

Megjegyzések

  • Ez a várt módon működik a Mac gépemen (10.10.1)
  • Bármilyen ötlet mi okozza, hogy nem működik az enyém? Tisztázandó: a Script Editorban működik, de ha a szkriptet alkalmazásként mentem, majd elindítom az alkalmazást, a késéseket figyelmen kívül hagyjuk. ‘ ez a legfurcsább dolog.
  • Ugyanez a problémám van a 10.10.3-on is.
  • Bejelentve az Apple-nek: openradar.me/21588747
  • Ezt a problémát az OS X 10.11 El Capitan operációs rendszerben javították.

Válasz

Megjegyzés: A fájl javítása megtörtént az OS X 10.11 El Capitan operációs rendszerben.

@ 2oh1, a megfelelő alapötlet van a válaszodban, de itt a teljes és helyes válasz:

Ennek kiküszöbölése az egyetlen ésszerű módszer, ha a cikluson belül a “késleltetést” hívja meg, amely biztosítja a kívánt időtartam elteltét a folytatás előtt. Ennek legjobb módja a “késleltetés” felülírása egy egyedi kezelővel:

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 

Ez lehetővé teszi, hogy a szkript többi részét változatlanul hagyja, és normálisan használhatja a “késleltetést”, pl.

delay 5 display alert "I like cake!" 

[MEGJEGYZÉS: Normál esetben az egyéni kezelő a “folytatás késleltetés időtartamát” használja a meghíváshoz a beépített “delay”, de azt tapasztaltam, hogy bár ez a Script Editorban működik, hibát ad vissza, ha egy kisalkalmazáson belül használják (“Nem lehet folytatni a késleltetést. (-1708) ”). Megkerültem ezt a problémát azzal, hogy közvetlenül az AppleScript-nek szóltam, hogy kezelje a delay parancsot, ahelyett, hogy a továbbjutást használná.]

A probléma az, hogy delay feldolgozza a felhasználót a szkript szüneteltetése közben, így továbbra is rákattinthat egy kisalkalmazás által megjelenített menükre vagy ablakokra, és van egy hiba (10.11-ben javítva), ahol a felhasználói bevitel miatt delay nem várja meg a teljes időtartam, mielőtt folytatná a szkript végrehajtását. Ha nem lép kapcsolatba az applettel, az delay megfelelően működik.

Megjegyzések

  • Minden ennek a hibának, vagy oka van a késésnek, ami így működik a Yosemite-szel?
  • Ez egy olyan hiba, amelyet a késleltetés nem késleltet.
  • Olyan furcsa ‘. Olyan applecript-t bíztam, amely a késõi éjszakát használja, és hirtelen a késés ismét megfelelõen mûködött. Feltételeztem, hogy a hibát kijavították Egy óra múlva, bár semmi sem változott, a hiba visszatért. I ‘ igazán zavarba jöttem. Nem számít azonban ‘ . ‘ Változóval állítom be az időt és a késleltetést öt perc múlva (például), és ez ‘ tökéletesen működik . Tehát … a probléma megoldódott, de ez nem ‘ nem magyarázza meg a probléma fennállásának okait. Érdekes, érdekes, érdekes.
  • Mivel az Apple lustálkodott. Apple a szoftver sokkal kevésbé megbízható, mivel évente elkezdték kiadni az OS X-et. Hiányoznak a magasabb OS X kisebb verziók (például 10.6.8), ahol az operációs rendszer sziklaszilárd volt. Csak

már nem szerez ilyen élményt.

  • Ha ‘ egy hiba (amivel egyetértek) a), miért nem ‘ t ez még mindig nem javítható, kíváncsi vagyok. Itt valaki készített radarjelentést? Kérem, akkor tegye fel az azonosítóját? (vagy / tegyen közzé az openradar.me webhelyen is)
  • Válasz

    Ugyanezzel a problémával küzdve találkoztam ez a válasz egy nem túl kapcsolódó kérdésre , és úgy döntött, hogy kipróbálja, és úgy tűnik, hogy dolgozzon nekem.

    Cserélje le a delay 5 szót a do shell script "/bin/sleep 5" kifejezésre, és ugyanazt az eredményt kapja.

    Megjegyzések

    • Köszönjük a megosztást! Mint fentebb mondtam, ‘ ezt nem tudom tesztelni, mert számomra értelmetlen okokból az 5-ös késleltetés úgy működik, ahogy nekem most kellene (most teszteltem egy pillanattal ezelőtt megint). Fogalmam sincs, hogy ez miért működik néha, és néha kudarcot vall.’ annyira furcsa. Végül egy olyan kerülő megoldást használtam, ahol megkapom az aktuális időt és beállítom változónak, majd szüneteltetem a szkriptet, amíg az idő változó plusz egy perc (természetesen 1 perc késéssel). ‘ nehézkes, de ‘ hónapok óta hibátlanul működött, míg az egyszerű késleltetés szakaszos volt. Ugh.
    • A 10.10.5 verziót futtatom, és ez a megoldás nem működik, és az alvás idejére is zárolja a szkriptet
    • @Greg: Ha „lezárja a szkriptet” az alvás időtartama, akkor ‘ működik. /bin/sleep megvárja az alvás időtartamát, és nem tér vissza, amíg be nem fejeződik. Ezzel szemben az AppleScript ‘ s beépített delay parancs kezeli a felhasználói beviteli eseményeket, amíg a parancsfájl szünetel. (A hiba itt rejlik: ha van felhasználói billentyűzet bevitel, delay folytatja a parancsfájl végrehajtását, mielőtt a késleltetési idő lejárt.)

    Válasz

    Nem azt mondom, hogy ez a legjobb megoldás, de úgy tűnik, hogy megoldotta a problémámat. Egyszerű késleltetés helyett, amelyet figyelmen kívül hagynak olyan okok miatt, amelyeket nem értek, átálltam az idő megszerzésére és a ciklusra, amíg el nem érünk egy új időpontot (még mindig használ egy késleltetést, de nem számít, ha figyelmen kívül hagyja a késleltetést, mivel a szkript nem folytatódik a elérkezett az idő).

    # 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 

    Még mindig haldoklik, hogy tudjam, miért hagyják figyelmen kívül a késleltetést (vagy drámai módon felgyorsítják?! ??), de ez az elvégzett munka, esetlen.

    Megjegyzések

    • A ” késleltetés ” parancs nem ‘ nem ” felgyorsult ” , it ‘ ek megszakítása. Késleltetés közben egy ciklusba ülve ellenőrzi, hogy vannak-e billentyűzet beviteli események, így ellenőrizheti a Parancsidőszakot. Nyilvánvalóan helytelenül lép ki a késleltetési ciklusból, ha bármilyen felhasználói bemenetet észlelnek.
    • Érdekes! ‘ m azt tapasztaltam, hogy ‘ t figyelmen kívül hagyják (felgyorsítják? Megszakítják?) Akkor is, ha a Macem tétlenül ül, de nem ‘ nem tudja, miért.
    • Amint egy felhasználói beviteli esemény bekerül az eseménysorba, a delay továbbra is addig kell szakítani, amíg valami nem kezeli az eseményeket és eltávolítja őket a sorból.

    Válasz

    Találtam egy munkát- körül egy német fórumbejegyzésben . Adja hozzá ezeket a sorokat a szkript tetejéhez:

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

    Megjegyzések

    • I ‘ gondjaim vannak a válasz tesztelésével, mert bármilyen okból a késés jelenleg a várt módon működik a Mac gépemen. Fogalmam sincs miért. Én ‘ m futok 10.10.3. Talán az Apple kijavította ezt a hibát? Vagy talán ‘ csak egy szakaszos probléma, amely nem ‘ hatással van a Mac-emre ebben a pillanatban. Ugh. Amint fentebb mondtam, a megoldásom az, hogy az Applescript megkapja az aktuális időt, majd késleltesse az aktuális időt plusz x-ig.
    • A 10.10.3 verziót is futtatom, és továbbra is látom a problémát. Mivel nem mindenki látja a problémát, valószínűleg ‘ szünetel, vagy harmadik féltől származó szoftverekhez vagy bizonyos preferencia-beállításokhoz kapcsolódik. Ki tudja. BTW, a megkerülésnek valószínűleg az a hátránya, hogy az alkalmazás a várakozás során továbbra is 100% -os CPU-időt használ, míg a megfelelő késleltetési magatartás az alkalmazás ezen időtartamra történő alvása, így kevesebb energiát használva.
    • A 10.10.5 verziót futtatom, és ez a megoldás nem működik.
    • @ThomasTempelmann: A probléma akkor jelentkezik, ha van felhasználói bevitel. Ha nem kattintasz vagy gépelsz a parancsfájl futása közben, akkor a hiba nem ‘ indult.
    • Vegye figyelembe, hogy ez a megoldás az alkalmazás tényleges lefagyását okozza az alvás idejére. A delay feldolgozza a felhasználói bevitelt, miközben a szkript szünetel, így például továbbra is interakcióba léphet a menükkel és az ablakokkal.

    Válasz

    carzyj volt az a véleményem, amely szerintem a legjobb, de Chris Page módszerével kombinálva a következőket kapja:

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

    Az “késleltetés” -től a “végkésleltetés” -ig kommentelheti az eredeti késleltetést.

    Megjegyzések

    • I szintén hasonló kódmódosítást hajtott végre, mielőtt ezt látta volna. A 10.10.5 verziót futtatom, és ez a megoldás nem működik, és az alvás idejére zárolja a szkriptet is.

    Válasz

    ez a @ chris-page megoldás módosítása

    Úgy tűnik, hogy egyensúly van az érzékenység és a késés pontos rögzítése között.

    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 

    De ahelyett, hogy azt mondanánk az Applescript-nek, hogy késleltesse a teljes időtartamot, csak azt mondjuk, hogy késleltessen egy töredékes időtartamot. ha a periódus kevesebb, mint amit az alma megenged (1/60 másodperc), akkor állítsuk be azt a delta értéket. Hogy megtartsunk némi reagálóképességet, mégis pontosak vagyunk. a gyanú az, hogy néha a késedelem nem “t” úgy dolgozzon, hogy az ismétlés közben ciklus zárva tartja a szálat, de sikertörténetek esetén azt szeretnénk, ha a késleltetési delta rövid lenne, hogy a folyamat még mindig megszakítható legyen

    Megjegyzések

    • A kért késleltetés rövidítése felesleges, és csak lassabban tudja futtatni a szkriptet, és várakozás közben több CPU-t fogyaszt. Az én verzióm csupán a késleltetést hívja meg, amíg a teljes kívánt időtartam le nem telik, lehetővé téve az delay számára a lehető legnagyobb késleltetést, mielőtt folytatja a végrehajtást.
    • Vegye figyelembe, hogy mivel ez a válasz elküldtem, frissítettem a kódomat, hogy delay endTime - (current date) -t használja delay duration helyett, ami biztosítja, hogy ha delay nem ‘ t megszakad, akkor ‘ t az eredeti kért időnél hosszabb ideig szünetelteti a szkriptet , amit valószínűleg megpróbált megoldani ezzel a válaszsal.

    Válasz

    Tehát, mindez együtt, azt hiszem, Chris ezt jelenti:

    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 

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük