Come eseguire sempre AppleScript personalizzato in background?

3

Dato un file AppleScript progettato per eseguire il polling di una finestra di dialogo dell'applicazione ogni 30 secondi, come posso configurare facilmente il mio Mac OS in modo che questo file AppleScript venga avviato ogni volta che accedo silenziosamente in background?

Il codice per lo script (nel caso sia interessato) è elencato di seguito ed è progettato per fare clic su "Più tardi" nell'app Beta AirMail:

repeat
    if (exists application "AirMail Beta") then
        tell application "System Events" to tell process "Airmail Beta"
            if exists (button "Later" of front window) then
                click (button "Later" of front window)
            end if
        end tell
    end if
    delay 30
end repeat

Lo script sopra funziona, ma se qualcuno può pensare a un modo migliore per fare automaticamente clic su una finestra di dialogo senza scrivere un AppleScript che esegue il polling ogni pochi secondi, sentiti libero di offrire una simile soluzione nei commenti. Principalmente, però, mi piacerebbe conoscere il modo migliore per gestire AppleScript progettato per essere eseguito continuamente in modo che possano essere abilitati / disabilitati e avviati senza essere visti all'accesso automatico.

    
posta sean2078 22.06.2015 - 04:19
fonte

4 risposte

7

Secondo me, il modo migliore per farlo è utilizzare lo schedulatore attività di Apple: launchd , perché non è necessario installare software di terze parti. Innanzitutto, la teoria: per eseguire uno script dalla riga di comando, è sufficiente eseguire:

osascript /PATH/TO/YOUR/script.scpt

Sapendo questo, tutto ciò che devi fare è creare un file plist in ~/Library/LaunchAgents/ con questo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>air-mail-beta.job</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/osascript</string>
        <string>/PATH/TO/YOUR/SCRIPT</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Il nome del file plist non ha importanza, ma dovrebbe essere in ~/Library/LaunchAgents/ . Inoltre, assicurati di modificare /PATH/TO/YOUR/SCRIPT di conseguenza.

Infine, devi solo dire a launchd che vuoi che questo script venga sempre eseguito. Per farlo, devi solo:

launchctl load -w ~/Library/LaunchAgents/NAME-OF-YOUR-PLIST.plist

e il gioco è fatto! Se sembra che lo script non sia stato avviato, puoi fare ciò:

 launchctl start air-mail-beta.job

dove air-mail-beta.job è la proprietà sotto <key>label</key> che abbiamo impostato nel file plist .

Infine, se dovessi aver bisogno di disabilitare lo script, non dimenticare di unload con:

launchctl unload -w ~/Library/LaunchAgents/NAME-OF-YOUR-PLIST.plist

So che questa soluzione è più tecnica, ma credimi, è un modo migliore per affrontare il tuo problema. Se hai qualche domanda, basta chiedere!

    
risposta data 22.06.2015 - 16:31
fonte
1

Fase uno:

Quando salvi lo script nell'editor degli script, salva come pacchetto di applicazioni, quindi aggiungilo agli elementi di avvio nelle preferenze di sistema di accesso.

Passaggio due "Sfondo"

Utilizza un'app iBackground Scripts per Mac

Simply drag and drop an AppleScript that has been saved as an 'Application bundle' on to this droplet. Clicking on the 'Yes' button will set your script to run in the background and will not display in the Dock

    
risposta data 22.06.2015 - 05:08
fonte
1

Ho avuto lo stesso problema. Stavo cercando di fare clic sul pulsante "OK" su kontakt in background mentre usavo il mio computer. Questo ha finito per funzionare per me.

tell application "System Events"
    if exists of application process "Kontakt 5" then
        tell application "Kontakt 5.6.0" to activate
        delay 0.5
        repeat
            try
                click UI element "OK" of window 1 of application process "Kontakt 5"
            end try
        end repeat
    end if
end tell
    
risposta data 20.10.2018 - 20:50
fonte
0

Potresti aggiungere una routine di stop al tuo script in background. Quindi scrivi un altro script per richiamare il fermo della routine in background ... Alcuni assembly richiesti.

come richiamare lo stringSet sull'istruzione di un altro script:

on run
    set myApp to "/Applications/applescriptFiles/demo -- the best/b.app"
    -- some hocus pocus is nesessary to avoid applescript from change path.
    -- set myApp to POSIX file myApp

    tell application myApp

        launch
        stringSet("stringie set") -- this function is in the "b" app.
    end tell
end run


(* 

save this as an application bundle 

invoked by a.app.  

twtwtw write in:
https://discussions.apple.com/thread/4917321?start=15&tstart=0

hocus-pocus: 

Give your script application a unique bundle id string (CFBundleIdentifier) and a unique bundle name (CFBundleName) too, to make life easier.  You set those in the info.plist file.  Launch the script app once to register it with launch services, and system will be able to find it thereafter.

Example:
      <key>CFBundleIdentifier</key>
      <string>com.rccharles.b</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>b</string>

    I added the CFBundleIdentifier info above the CFBundleInfoDictionaryVersion line. I left the CFBundleInfoDictionaryVersion and CFBundleName as is.

    *)

property myVar : "initial value"

on run
    display dialog myVar
end run

on stringSet(inputVar)
    set myVar to inputVar
    display dialog "variable myVar is " & myVar
end stringSet
    
risposta data 17.12.2018 - 04:17
fonte

Leggi altre domande sui tag