8 votes

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

Compte tenu d'un fichier AppleScript conçu pour interroger une boîte de dialogue d'application toutes les 30 secondes, comment puis-je facilement configurer mon Mac OS de manière à ce que ce fichier AppleScript démarre silencieusement en arrière-plan à chaque fois que je me connecte ?

Le code pour le script (au cas où vous seriez intéressé) est listé ci-dessous, et est conçu pour cliquer sur "Plus tard" sur 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 pense à une meilleure façon d'auto-cliquer sur un dialogue sans écrire un AppleScript qui interroge toutes les quelques secondes, n'hésitez pas à proposer une telle solution dans les commentaires. Mais surtout, j'aimerais connaître la meilleure façon de gérer les AppleScripts conçus pour s'exécuter en continu afin qu'ils puissent être activés/désactivés et démarrer sans être vus automatiquement lors de la connexion.

10voto

LaX Points 559

À mon avis, la meilleure façon de le faire est d'utiliser le planificateur de tâches d'Apple : launchd car vous n'avez pas besoin d'installer de 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 fichier plist dans le fichier ~/Library/LaunchAgents/ avec ceci :

<?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 n'a pas d'importance, mais il doit se trouver dans le fichier ~/Library/LaunchAgents/ . Veillez également à modifier /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 cela, il suffit de faire :

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

et le tour est joué ! S'il semble que le script n'a pas démarré, vous pouvez faire ceci :

 launchctl start air-mail-beta.job

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

Enfin, si vous avez besoin de désactiver le script, n'oubliez pas de cliquer sur 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 la meilleure façon de résoudre votre problème. Si vous avez des questions, n'hésitez pas à les poser !

1voto

curtified Points 21

J'ai eu le même problème. J'essayais de cliquer sur le bouton "OK" de Kontakt en arrière-plan pendant que j'utilisais mon ordinateur. Ceci a fini par fonctionner 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

0voto

Kerry Jones Points 145

Vous pouvez ajouter une routine d'arrêt à votre script d'arrière-plan. Vous écrivez ensuite un autre script pour invoquer l'arrêt de votre routine d'arrière-plan... Un peu d'assemblage est nécessaire.

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

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X