¿Cómo creo un AppleScript que cerrará una aplicación en un momento específico y luego pondrá la computadora en suspensión?

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 apagarla, sería muy apreciado.

¿Le gustaría que esto se hiciera regularmente o es algo que desea iniciar manualmente?
¿Ya tienes el AppleScript escrito?
Es algo que me gustaría hacer con regularidad y no tener que preocuparme por iniciarlo. Tenía un guión escrito, pero estaba bastante desordenado, así que lo tiré a la basura y terminé aquí. Gracias por tu respuesta. Lo intentaré y espero que aclare los problemas que he estado teniendo.
si desea que esto se haga regularmente, programar el trabajo con atno es lo que desea. crono launchd. Si desea una interfaz más fácil para configurar eso, tal vez lingon 3 lo ayude.

Respuestas (4)

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 comando, pero cualquier comando se puede ejecutar 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 una hora específica.

1. Indicar a la aplicación que se cierre

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 modo de 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. Deberá habilitar esta funcionalidad, ya que no está predeterminada. 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 puede programarse para una hora específica emitiendo

echo "<command>" | at HH:MM

que funciona porque attoma su entrada de stdinforma predeterminada. Un enfoque más simple es ejecutar los comandos enumerados en un archivo. Un archivo se puede ejecutar usando la -fbandera, seguida del nombre del script que se ejecutará de esta manera:

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

Poniendolo todo junto

Lo que sigue asume que atrunestá habilitado. Como ejemplo de juguete, digamos que quiero salir de Mail y poner la computadora en modo de suspensión a las 11 p. m. Crearía un archivo que contenga 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 verificación para asegurarme de que Mail realmente se cerró. La secuencia de comandos también asume que nada más se interpondrá en el modo de poner la computadora en modo de suspensión. Lo he mantenido simple aquí como un punto de partida para lo que quieres.

Puede programar un evento una vez con en:

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

O para programarlo para 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
a las 23:59 <<< 'osascript -e "salir de la aplicación \"Correo\""; pmset sleepnow' no funciona para mí. Dice "trabajo 1 el sábado 30 de abril a las 12:47:00 de 2016", pero no ejecuta el comando cuando llega el momento.

Aquí hay una versión estrictamente de applescript 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 asume que la cadena de tiempo se relaciona con el día de hoy.

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

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