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

2

El proceso, RSScriptRunner , representa un script actualmente en ejecución que fue activado por FastScripts.app. (FastScripts no asigna títulos de proceso únicos a los scripts que activa).

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

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

solo devolverá el nombre de la ventana del proceso que comenzó la primera vez.

Sin embargo, me gustaría obtener cada nombre de ventana de cada proceso RSScriptRunner .

¿Alguien sabe cómo lograr esto en AppleScript?

Mi intención final aquí es implementar una comprobación que garantice que solo una instancia de un script pueda ejecutarse simultáneamente. Se pueden ejecutar múltiples secuencias de comandos diferentes, pero los múltiplos de una secuencia de comandos que se ejecutan al mismo tiempo no son deseables.

El código se vería así:

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 comprobación se ubicará en la parte superior de la secuencia de comandos.

Nota:

Esta es en gran medida una situación en la que la latencia mínima es crucial.

Yo había ideado un método de largo aliento que realizó con éxito mi resultado deseado. El método implicaba obtener cada título de proceso actual en una lista, y obtener cada ID de proceso actual en otra lista correspondiente. Luego recuperé el nombre de la ventana de cada proceso RSScriptRunner a través de su ID de proceso respectivo (que, a diferencia del nombre del proceso, debe ser único).

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

    
pregunta rubik's sphere 14.06.2017 - 10:51

1 respuesta

1

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

Puedes usar una cláusula cuya , como esta:

Para un proceso que contiene solo una ventana, use este script:

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, use 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 , quizás funcione también para otros sistemas operativos , para obtener el nombre de los scripts iniciados, es utilizar 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

Informaciones :

  • $(pgrep -x RSScriptRunner) : un sub shell para obtener el ID de proceso de Cada instancia de RSScriptRunner , la opción '-x': requiere una coincidencia exacta del nombre del proceso
  • ps -p : obtenga el comando de cada PID (el resultado contiene la ruta de acceso de el script lanzado).
  • El comando sed : eliminar caracteres desde el principio de la línea a través del último carácter de barra diagonal para obtener el nombre del guión (el La opción -n es imprimir la línea que contiene el Sólo la palabra ' RSScriptRunner ', porque la primera línea son los encabezados - > PID TTY TIME CMD ).
respondido por el jackjr300 15.06.2017 - 19:09

Lea otras preguntas en las etiquetas