AppleScript: come ottenere tutti i nomi di finestre di processi che condividono lo stesso titolo?

2

Il processo, RSScriptRunner , rappresenta uno script attualmente in esecuzione attivato da FastScripts.app. (FastScripts non assegna titoli di processo univoci agli script attivati).

Se uno ha più processi titolati RSScriptRunner in esecuzione simultaneamente, quindi il seguente codice:

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

restituirà solo il nome della finestra del processo che è iniziato al più presto.

Tuttavia, vorrei ottenere il nome di ogni finestra di ogni processo RSScriptRunner .

Qualcuno sa come ottenerlo in AppleScript?

Il mio intento ultimo qui è quello di implementare un controllo che assicuri che solo una istanza di uno script possa essere eseguita simultaneamente. È possibile eseguire più script diversi in esecuzione, ma i multipli di uno script in esecuzione allo stesso tempo non sono desiderati.

Il codice sarebbe simile a questo:

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

Questo controllo si trova nella parte superiore dello script.

Nota:

Questa è una situazione in cui la latenza minima è cruciale.

Ho ideato un metodo prolisso che ha realizzato con successo il mio risultato desiderato. Il metodo consisteva nel portare ogni titolo di processo corrente in una lista e ottenere ogni ID di processo corrente in un altro elenco corrispondente. Ho quindi recuperato il nome della finestra di ogni processo RSScriptRunner tramite il rispettivo ID del processo (che, a differenza del nome del processo, deve essere univoco).

Tuttavia, questo metodo ha portato con sé un paio di secondi di latenza. Ho bisogno di una soluzione che sia quasi istantanea (ad esempio, la riga di codice sopra).

    
posta rubik's sphere 14.06.2017 - 10:51
fonte

1 risposta

1

Nota: nel mio sistema, macOS Sierra , non esiste una finestra per questo processo.

Puoi utilizzare una cui clausola, come questa:

Per un processo che contiene solo una finestra, usa questo 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

Per un processo che può contenere una o più finestre, usa questo 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 soluzione per macOS Sierra , forse funziona anche per altri sistemi operativi , per ottenere il nome degli script lanciati, è utilizzare ps e pgrep comandi.

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

Informazioni :

  • $(pgrep -x RSScriptRunner) : una sub shell per ottenere l'ID del processo ogni istanza di RSScriptRunner , l'opzione '-x': richiesta una corrispondenza esatta del nome del processo
  • ps -p : ottieni il comando di ogni PID (il risultato contiene il percorso di lo script avviato).
  • Il comando sed : cancella i caratteri dall'inizio della riga attraverso l'ultimo carattere barra per ottenere il nome dello script (il -n opzione è stampare la riga che contiene il Solo " RSScriptRunner ", perché la prima riga è l'intestazione - > PID TTY TIME CMD ).
risposta data 15.06.2017 - 19:09
fonte

Leggi altre domande sui tag