Comment faire pour exécuter AppleScript personnalisé en arrière-plan à tout moment?

3

Étant donné qu'un fichier AppleScript conçu pour rechercher une boîte de dialogue d'application toutes les 30 secondes, comment puis-je configurer facilement mon Mac OS afin que ce fichier AppleScript démarre chaque fois que je me connecte en arrière-plan?

Le code du script (en cas d'intérêt) est répertorié ci-dessous et est conçu pour cliquer sur "Plus tard" dans l'application AirMail Beta:

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

Le script ci-dessus fonctionne, mais si quelqu'un peut penser à un meilleur moyen de cliquer automatiquement sur une boîte de dialogue sans écrire un AppleScript interrogé toutes les quelques secondes, n'hésitez pas à proposer une telle solution dans les commentaires. Mais surtout, j'aimerais connaître le meilleur moyen de gérer les AppleScripts conçus pour fonctionner en continu de manière à ce qu'ils puissent être activés / désactivés et au démarrage sans être vus automatiquement à la connexion.

sean2078
la source

Réponses:

7

À mon avis, le meilleur moyen de le faire est d'utiliser le propre planificateur de tâches d'Apple: launchd, car vous n’avez pas besoin d’installer un logiciel tiers. Tout d’abord, la théorie: pour exécuter un script à partir de la ligne de commande, il suffit de lancer:

osascript /PATH/TO/YOUR/script.scpt

Sachant cela, tout ce que vous avez à faire est de créer un plist déposer dans ~/Library/LaunchAgents/ avec ça:

<?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>

Le nom du plist fichier n'a pas d'importance, mais il devrait être dans ~/Library/LaunchAgents/. Aussi, assurez-vous de changer /PATH/TO/YOUR/SCRIPT en conséquence.

Enfin, il vous suffit de dire launchd que vous voulez que ce script soit toujours exécuté. Pour ce faire, il vous suffit de faire:

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

et tu as fini! Si le script ne semble pas avoir commencé, vous pouvez le faire:

 launchctl start air-mail-beta.job

air-mail-beta.job est la propriété sous <key>label</key> que nous avons mis dans le plist fichier.

Enfin, si vous avez besoin de désactiver le script, n'oubliez pas de unload avec:

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

Je sais que cette solution est plus technique, mais croyez-moi, c'est une meilleure façon de traiter votre problème. Si vous avez des questions, il suffit de demander!

LaX
la source
Merci pour cette solution. Le nom du .job être quelque chose dans le .plist fichier? J'ai essayé de faire une coutume .plist et il semble charger avec succès le .plist avec launchhd, mais le script lui-même ne semble pas commencer. Je ne reçois aucun retour dans le terminal lorsque je le fais launchctl ensuite. Je sais que le script fonctionne parce que si je fais simplement osascript /PATH/to/script.scpt il fait ce qu'il est censé faire.
Winterflags
Vivre exactement le même problème que @Winterflags
Sandwich
1

La première étape:

Lorsque vous enregistrez le script dans l'éditeur de script, enregistrez-le en tant qu'ensemble d'applications, puis ajoutez-le aux éléments de démarrage dans les préférences système de connexion.

Deuxième étape "Contexte"

Utilisez une application Scripts de fond pour Mac

Il suffit de glisser-déposer un AppleScript qui a été enregistré en tant que   «Application bundle» sur cette gouttelette. En cliquant sur le bouton 'Oui'   définira votre script pour s'exécuter en arrière-plan et ne s'affichera pas dans   le quai

Buscar웃
la source
Je ne sais pas comment iBackground fonctionne, mais en fonction du paramètre qu'il modifie dans le fichier info.plist du script enregistré, l'application peut s'exécuter en arrière-plan, ce qui signifie que vous ne pouvez pas le quitter facilement, car il agit maintenant comme un processus et n'affiche aucun GUI.
markhunte
Vous pouvez l'inverser en cliquant sur le bouton 'Non'. Ce ne sera plus un script d'arrière-plan et s'affichera dans le Dock. Si vous ne voyez pas le changement immédiatement, déplacez le AppleScript vers un autre emplacement (Commande + glisser).
Buscar웃
Confirmez-vous que si vous souhaitez le quitter, vous ne pouvez pas le faire via l'interface graphique si vous utilisez cette application pour modifier une application en arrière-plan.
markhunte
1

J'ai eu le même problème. J'essayais de cliquer sur le bouton "OK" de Kontakt en arrière-plan pendant l'utilisation de mon ordinateur. Cela a fini par travailler pour moi.

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
curtified
la source
0

Vous pouvez ajouter une routine d’arrêt à votre script d’arrière-plan. Vous écrivez ensuite un autre script pour appeler le bouchon de votre routine d'arrière-plan ... Un assemblage est requis.

comment invoquer le stringSet sur la déclaration d'un autre 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
historystamp
la source