Come eseguire sempre AppleScript personalizzato in background?


3

Dato un file AppleScript progettato per eseguire il polling per una finestra di dialogo dell'applicazione ogni 30 secondi, come posso configurare facilmente il mio Mac OS in modo che questo file AppleScript si avvii ogni volta che eseguo il login silenzioso in background?

Il codice per lo script (nel caso interessato) è elencato di seguito ed è progettato per fare clic su "Più tardi" nell'app Beta di 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 clic automaticamente su una finestra di dialogo senza scrivere un AppleScript che esegue il polling ogni pochi secondi, sentiti libero di offrire una tale soluzione nei commenti. Principalmente, però, vorrei sapere il modo migliore per gestire gli AppleScript progettati per essere eseguiti in modo continuo in modo che possano essere abilitati / disabilitati e avviarsi senza essere visti automaticamente all'accesso.

Risposte:


7

A mio avviso, il modo migliore per farlo è utilizzare lo scheduler di Apple: launchdperché 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 plistfile ~/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 plistfile non ha importanza, ma dovrebbe essere in ~/Library/LaunchAgents/. Inoltre, assicurati di cambiare di /PATH/TO/YOUR/SCRIPTconseguenza.

Infine, devi solo dire launchdche vuoi che questo script sia sempre in esecuzione. Per farlo, basta fare:

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

e hai finito! Se sembra che lo script non sia stato avviato, puoi farlo:

 launchctl start air-mail-beta.job

dove si air-mail-beta.jobtrova la proprietà sotto <key>label</key>quella che abbiamo impostato nel plistfile.

Infine, se dovessi mai disabilitare lo script, non dimenticartene unloadcon:

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

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


Grazie per questa soluzione Il nome dell'essere può .jobessere qualcosa nel .plistfile? Ho provato a creare un'abitudine .pliste sembra caricare correttamente .plistcon launchhd, ma lo script stesso non sembra avviarsi. Non ricevo feedback in Terminal quando lo faccio launchctldopo. So che lo script funziona perché se lo faccio semplicemente osascript /PATH/to/script.scptfa quello che dovrebbe.
Winterflags

Si è verificato esattamente lo stesso problema di @Winterflags
Sandwich il

1

Primo passo:

Quando si salva lo script nell'editor degli script, salvarlo come pacchetto dell'applicazione, quindi aggiungerlo agli elementi di avvio nelle preferenze del sistema di accesso.

Passaggio due "Sfondo"

Utilizza un'app iBackground Scripts per Mac

Basta trascinare e rilasciare un AppleScript che è stato salvato come un "pacchetto di applicazioni" su questo droplet. Facendo clic sul pulsante "Sì", lo script verrà eseguito in background e non verrà visualizzato nel Dock


Non sono sicuro di come funzioni iBackground, ma a seconda dell'impostazione che sta cambiando nelle info.plist dello script salvato, l'app potrebbe essere eseguita in background, il che significa che non puoi chiuderla facilmente perché ora funziona come un processo e non ha Gui visualizzato
markhunte

Puoi invertirlo facendo clic sul pulsante "No" e non sarà più uno script in background e verrà visualizzato nel Dock. Se non vedi immediatamente la modifica, sposta AppleScript in un'altra posizione (Comando + trascina).
Ruskes,

Stai confermando se vuoi chiuderlo non puoi farlo tramite la GUI se usi questa app per apportare la modifica a un'app in background.
markhunte,

1

Ho avuto lo stesso problema. Stavo cercando di fare clic sul pulsante "OK" su kontakt in background mentre utilizzavo 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

0

È possibile aggiungere una routine di interruzione per lo script in background. Quindi scrivi un altro script per invocare il tappo della tua routine in background ... È necessario un assemblaggio.

come invocare 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.