¿Cómo creo un AppleScript que salga de una aplicación en un momento específico y luego apague la computadora?

8

He estado jugando con AppleScript y Automator para que esto funcione, pero parece que no puedo entenderlo. Si alguien pudiera mostrarme un ejemplo o darme algunos consejos sobre cómo puedo configurar una aplicación para que se cierre en un momento específico y luego poner la computadora en suspensión o apagado, sería muy apreciado.

Tomás Richardson
fuente
¿Le gustaría que esto se haga regularmente o es algo que desea iniciar manualmente?
ephsmith
¿Ya tienes el AppleScript escrito?
ephsmith
Es algo que me gustaría hacer regularmente y no tener que preocuparme por iniciar. Tenía un guión escrito pero era bastante desordenado, así que lo descarté y terminé aquí. Gracias por tu respuesta. Voy a intentarlo y espero que aclare los problemas que he tenido.
Tomás Richardson
si quieres que esto se haga regularmente, entonces programar el trabajo atno es lo que quieres. crono launchd. Si desea una interfaz más fácil de configurar, tal vez lingon 3 lo ayude.
ephsmith

Respuestas:

14

Supongo que le gustaría iniciar este procedimiento en lugar de ejecutarlo a una hora programada regularmente.

Mi enfoque sería iniciar esto desde la línea de comandos, pero cualquier comando puede ejecutarse en un componente de script de shell de un script de Automator con alguna modificación. El siguiente enfoque combina algunos componentes para hacer el trabajo:

  1. Un tellcomando para salir de la aplicación.
  2. Una llamada de línea de comandos para poner la computadora en suspensión
  3. Una llamada de línea de comandos para programar 1 y 2 para un tiempo específico.

1. Diciéndole a la aplicación que abandone

Esto puede ser tan simple como:

osascript -e 'tell application "AppName" to quit'

2. Poner la computadora a dormir

Eche un vistazo pmsetpara obtener más detalles, pero emitir el siguiente comando pondrá su computadora en suspensión:

pmset sleepnow

3. Programar una operación para que se ejecute en un momento específico

Echa un vistazo al comando at . Este comando le brinda la capacidad de especificar una hora para que se ejecute un comando. Tendrá que habilitar esta funcionalidad, ya que no es por defecto. Para habilitar el atrundemonio, ejecute el siguiente comando [referencia en SU] :

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist

Una vez que haya habilitado atrun, cualquier comando se puede programar para un tiempo específico emitiendo

echo "<command>" | at HH:MM

que funciona porque attoma su entrada de stdinforma predeterminada. Un enfoque más simple es ejecutar comandos enumerados en un archivo. Se puede ejecutar un archivo utilizando el -findicador, seguido del nombre del script que se ejecutará de esta manera:

at -f /path/to/file HH:MM

Poniendolo todo junto

Lo que sigue supone que atrunestá habilitado. Como ejemplo de juguete, digamos que quiero salir de Mail y poner la computadora a dormir a las 11 p.m. Crearía un archivo que contiene los comandos que quiero ejecutar de la siguiente manera:

osascript -e 'tell application "Mail" to quit'
pmset sleepnow

Guarde ese archivo quit-and-sleepy luego ejecútelo en la línea de comando

at -f /path/to/quit-and-sleep 23:00

Advertencias

No hice ninguna comprobación para asegurarme de que Mail realmente se cerró. El script también asume que nada más va a obstaculizar el sueño de la computadora. Lo he mantenido simple aquí como punto de partida para lo que quieres.

ephsmith
fuente
1

Aquí hay una versión estrictamente applecript que logra esto dado un valor de tiempo codificado. Por supuesto, podría hacer que esta parte sea interactiva si lo desea. Además, esta versión supone que la cadena de tiempo se relaciona con la actualidad.

--Get time setting for action to occur
set t to "3:16:30 PM"
--build a time string to use as a target.
set cd to (current date) as text
set AppleScript's text item delimiters to " "
set targetTime to text items 1 thru -3 of cd
set targetTime to date ((targetTime as text) & " " & t)

repeat while (current date) < targetTime
    beep
    delay 30 -- check the time every 30 seconds
end repeat

tell application "Mail"
    quit
end tell

tell application "Finder"
    display dialog "Do you want to shut the computer down now?"
    if button returned of the result is "Ok" then
        shutdown
    end if
end tell
Paul Skinner
fuente
1

Puede programar un evento una vez con:

at 23:59 <<< 'osascript -e "quit app \"Mail\""; pmset sleepnow'

O para programar que se repita todos los días, edite el crontab con EDITOR=nano crontab -ey agregue una entrada como esta:

59 23 * * * osascript -e 'quit app "Mail"'; pmset sleepnow
Lri
fuente
a las 23:59 <<< 'osascript -e "salir de la aplicación \" Mail \ ""; pmset sleepnow 'no funciona para mí. Dice "trabajo 1 al sáb 30 de abril 12:47:00 2016" pero no ejecuta el comando cuando llegue el momento
oluckyman
0

Aquí hay un código que esperará una cantidad de segundos antes de salir de la aplicación actual e irse a dormir.

delay (your amount of seconds here)
tell application "System Events"
    key down {command}
    keystroke "q"
    key up {command}
    set volume "1"
    say "computer going to sleep"
    tell application "Finder"
        sleep
    end tell
end tell
imagophereatingapickle
fuente