2 votos

AppleScript: ¿Cómo obtener los nombres de la ventana de procesos que comparten el mismo título?

El proceso, RSScriptRunner, representa, actualmente, una de ejecutar el script que fue provocado por FastScripts.app. (FastScripts no asignar un único proceso títulos de secuencias de comandos que se activa.)

Si uno tiene varios procesos titulado RSScriptRunner ejecutan simultáneamente, entonces el siguiente código:

tell application "System Events" to windows of process "RSScriptRunner"

sólo se devolverá el nombre de la ventana del proceso que se inició la primera.

Sin embargo, me gustaría conseguir que cada nombre de la ventana de cada RSScriptRunner proceso.

¿Alguien sabe cómo llevar a cabo esto en AppleScript?


Mi última intención es implementar un cheque que se garantiza que sólo un ejemplo de una secuencia de comandos se pueden ejecutar simultáneamente. Varios scripts que se ejecutan está bien, pero los múltiplos de un script que se ejecuta al mismo tiempo que es indeseable.

El código sería algo como esto:

tell application "System Events"
    set theWindowList to windows of process "RSScriptRunner"
    if theWindowList contains "The title of the initial dialog of this script goes here." then
        error number -128
    end if
end tell

Esta verificación se encuentra en la parte superior de la secuencia de comandos.


Nota:

Esta es una situación donde una latencia mínima es crucial.

Yo había ideado un largo aliento método que se realiza con éxito mi resultado deseado. El método implicaba llegar a cada proceso actual título en una lista, y llegar a todas las ID de proceso a otro, de la lista correspondiente. Yo, a continuación, recupera el nombre de la ventana de cada RSScriptRunner proceso a través de su respectivo IDENTIFICADOR de proceso (que, a diferencia de en el nombre del proceso, debe ser único).

Sin embargo, este método trajo con él un par de segundos de latencia. Necesito una solución que es casi instantánea (por ejemplo, la línea de código anterior).

2voto

Baczek Puntos 150

Nota: En mi sistema, macOS Sierra, no hay ninguna ventana para este proceso.

Puede utilizar una cuya cláusula, como este:

Para un proceso que contiene una única ventana, utilizar esta secuencia de comandos:

tell application "System Events"
    set theWindowList to name of window 1 of (processes whose name is "RSScriptRunner")
    if theWindowList contains "The title of the initial dialog of this script goes here." then
        error number -128
    end if
end tell

Para un proceso que puede contener una o más ventanas, el uso de este script:

tell application "System Events"
    set myList to name of windows of (processes whose name is "RSScriptRunner") -- get a list of lists, each sublist contains names 
end tell
set theWindowList to my subListsToOneList(myList) --  Flattening a list of lists

if theWindowList contains "The title of the initial dialog of this script goes here." then
    error number -128
end if

on subListsToOneList(l)
    set newL to {}
    repeat with i in l
        set newL to newL & i
    end repeat
    return newL
end subListsToOneList

La solución para macOS Sierra, tal vez se trabaja para otros sistemas operativos así, para obtener el nombre de la puesta en marcha de los scripts, es el uso de la ps y pgrep comandos.

set theNameList to paragraphs of (do shell script "ps -p $(pgrep -x RSScriptRunner) | sed -n 's:.*RSScriptRunner.*/::p'") -- get the name of the scripts
if theNameList contains "the name of this script.scpt" then error number -128

Información:

  • $(pgrep -x RSScriptRunner) : Una sub-shell para obtener el IDENTIFICADOR de proceso de cada instancia de la RSScriptRunner, la 'x' opción: requieren una coincidencia exacta del nombre de proceso
  • ps -p: obtener el mando de cada uno de los PID (el resultado contiene la ruta de acceso de la puesta en marcha de secuencia de comandos).
  • El sed comando : borrar todos los caracteres desde el principio de la línea a través del último carácter de barra diagonal para obtener el nombre de la secuencia de comandos (la -nopción es imprimir la línea que contiene el 'RSScriptRunner' solo con la palabra, porque la primera línea es la de los encabezados --> PID TTY TIME CMD).

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