3 votos

Automator script de servicio, SIEMPRE se abre la aplicación, haciendo caso omiso de condicional

Yo escribí un pequeño script de servicio para abrir un iTerm ventana de terminal en cualquier carpeta en el Finder.

Quiero comprobar si iTerm se está ejecutando, y si es para abrir la sesión de terminal server en una nueva pestaña en lugar de en una existente.

El guión va como esto:

on run {input, parameters}

set cdPath to "cd " & (quoted form of POSIX path of (input as string))

if application "iTerm" is running then
    display notification "running"
    tell application "iTerm"
        set termWin to (current terminal)
        tell termWin
            launch session "Default"
            tell the last session
                write text cdPath
            end tell
        end tell
    end tell
else
    display notification "not running"
    tell application "iTerm"
        activate
        set termWin2 to (current terminal)
        tell termWin2
            tell the last session
                write text cdPath
            end tell
        end tell
    end tell
end if
return input
end run

El problema es que cuando ejecuto el script como un servicio, siempre se comportan como si iTerm ya se estaba ejecutando (mostrar la "ejecución" de la notificación), incluso si iTerm es cerrado y muy claramente NO se ejecuta.

Pero si puedo pegar el mismo script en el Editor de secuencias de Comandos (configuración de cdPath literal, como set cdPath to "cd /etc") y ejecutarlo directamente funcionará correctamente, ya sea la apertura de una nueva iTerm instancia o la reutilización de una existente y crear una nueva pestaña, y mostrar las notificaciones correspondientes.

¿Qué está pasando aquí? Por qué la ejecución de la secuencia de comandos como un servicio detectar la aplicación ejecuta no importa qué?

Actualización

Si me simplificar la secuencia de comandos para mostrar las notificaciones como esta:

on run {input, parameters}

set cdPath to "cd " & (quoted form of POSIX path of (input as string))

  if application "iTerm" is running then
    display notification "running"
  else
    display notification "not running"
  end if
  return input
end run

Va a comportarse como se espera (mostrar 'running' o 'no se ejecuta' en consecuencia).

Pero si puedo añadir el "tell " aplicación" de la parte, siempre se vaya a través de la "ejecución" de la rama, no importa qué.

E. g.:

on run {input, parameters}

set cdPath to "cd " & (quoted form of POSIX path of (input as string))

  if application "iTerm" is running then
    display notification "running"
  else
    display notification "not running"
    tell application "iTerm"
        activate
    end tell
  end if
  return input
end run

Siempre abierto iTerm (incluso si el tell application "iTerm" está en el "no funciona" en la rama, pero la pantalla de la "ejecución" de la notificación, de la "ejecución" de la rama... La mera presencia de un "informe de aplicación" supondrá la apertura de la aplicación a continuación, se ejecute el Servicio.

Hay una forma de evitar esto?

Gracias y saludos.

1voto

zonble Puntos 2925

El-Capitans restricciones de seguridad NO son responsables por errónea comportamiento anterior. He probado el script un poco más y encontró que:

  • Cualquier "está funcionando"-frase debe tener un corto "retraso" en frente de ella de forma fiable el retorno de una verdadera respuesta ... pero todavía no lo hará si se llama como una aplicación de servicio.
  • Además supongo que Automator los guiones son de alguna manera "pre-procesada antes de que se ejecutan como Servicios.
    Todos los si-ramas son evaluados (interpretado a través de) y por lo tanto activa "por si acaso".

En jweaks código en stackoverflow, iTerm sólo se ve afectada directamente en la cláusula 2ª ("dicen ...").

tell application "System Events" to set theProcesses to name of every ¬
    every process whose visible is true

if theProcesses contains "iTerm" then display notification "running"
else [...]


Prueba este código en ScriptEditor, Automator y como Servicio en Safari:

display notification "" & running of application "TextEdit"
tell application "TextEdit" to activate
quit application "TextEdit"
display notification "" & running of application "TextEdit"

Usted obtendrá resultados diferentes de AppleScript/Automator (=> false + true) y Safari (true + true).
Especialmente AppleScript/Automator es cierto desde el 2 de notificación es muy reveladora.

... sin embargo, si usted inserta un minuto de retraso, dicen 0.01, después de que el "quit" de la línea, la ejecución será probado como "falso" - si el script se ejecuta desde dentro de AppleScript/Automator.

0voto

Pejvan Puntos 376

A veces también he notado que el comportamiento a la hora de ejecutar el script, es raro. Aunque la mayoría de las veces no sucede cuando no se está ejecutando el script a través del Editor de secuencias de Comandos. Sin embargo, aquí es una mejor alternativa:

tell application "System Events"
    # Adding tell application block has no effect on the if condition
    # Try it with TextEdit, that's what I using to try this code, and works fine.
    if (the name of application processes as text) contains "iTerm" then
        # Will quit the application if running
        log "Running"
        tell application "iTerm" to quit
    else
        # Will launch the application otherwise.
        log "Not Running"
        tell application "iTerm" to activate
    end if
end tell

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X