it-swarm.com.de

Wie kann ich eine AppleScript-Anwendung starten und Shell-Skripte von einem anderen AppleScript ausführen?

Hier sind meine Dateien:

launcher.applescript

tell application ":path:to:applescript:apps:Shell-script-launcher.app" to launch

Shell-script-launcher.app [AppleScript, als Anwendung gespeichert]

 do Shell script "say starting script"

Gewünschtes Verhalten:

  1. Führen Sie "launcher.applescript" im AppleScript Editor aus
  2. Auf "Startskript" hören

Tatsächliches Verhalten:

  1. Das Ausführen der Datei "Shell-script-launcher.app" durch manuelles Öffnen im Finder führt zu einem erwarteten Verhalten
  2. Das Ausführen von "launcher.applescript" öffnet die Datei "Shell-script-launcher.app", führt jedoch niemals das Shell-Skript aus.

Ich habe versucht, die App als "Nur ausführen" sowie als "Offen bleiben" zu speichern. Immer noch kein Fortschritt. Was empfehlen Sie. Das Endergebnis muss eine Bewerbung anstelle eines Applescript sein.

9
Ryan

Konzeptuell:

  • der Befehl run wird gestartet und führt eine Anwendung aus. ausgeblendet
  • der Befehl activate startet, startet und aktiviert die Anwendung (macht sie zur vordersten Anwendung)
  • launch, nach Apple , "Startet eine Anwendung, wenn sie noch nicht ausgeführt wird, sendet jedoch keinen Ausführungsbefehl."
    • für AppleScript-basierte Anwendungen bedeutet dies sollte, dass sie geladen sind, aber nicht ausgeführt (dh ihr - impliziter oder expliziter - on run-Handler wird NICHT aufgerufen). , aber in der Praxis stimmt das bis 10.9 nicht - siehe unten.
    • für mich ist unklar, was genau das für nicht- AppleScript-basierte Anwendungen bedeutet

So funktioniert Apple denkt nach mit AppleScript-basierten Anwendungen . Dies ist nur wahr, beginnend mit OSX 10.10 (Yosemite):

Ein Skript kann Befehle genauso wie andere Anwendungen an eine Skriptanwendung senden. Um eine nicht geöffnete Anwendung zu starten und das Skript auszuführen, verwenden Sie einen Startbefehl gefolgt von einem Ausführungsbefehl wie folgt:

launch application "NonStayOpen"
run application "NonStayOpen"

Der Startbefehl startet die Skriptanwendung, ohne einen impliziten Ausführungsbefehl zu senden. Wenn der run-Befehl an die Skriptanwendung gesendet wird, verarbeitet er den Befehl, sendet ggf. eine Antwort zurück und wird beendet.

Fehlerhaftes Verhalten unter OSX 10.8, 10.9 (behoben in OSX 10.10):

launchvon selbst reicht aus, um run die Anwendung auszuführen, und ist tatsächlich der einzige Befehl, der mit AppleScript-basierten Anwendungen. ausgeführt werden kann. Jeder Versuch, run oder auszuführen activate (ob zusätzlich zu launch oder nicht) führt die Anwendung aus - sogar zweimal, wenn sie vom AppleScript-Editor ausgeführt wird (!; nur einmal mit osascript) -, aber der Fehler <appName> got an error: Connection is invalid gemeldet wird.

Dies erscheint mir als Fehler.
Nicht sicher, wie sich OSX-Versionen <= 10.7 verhalten.

Hinweis: Ich habe einmal mit launch das nicht-ausführende Verhalten miterlebt, aber jede nicht auf AppleScript-basierende Testanwendung, die ich unter OS X 10.9.2 und OS X 10.8.5 von Grund auf erstellt habe, wird ebenfalls ausgeführt das Skript mit launch - widerspricht dem, was in der Dokumentation steht.

Bitte lassen Sie mich wissen, ob sich Ihr System anders verhält und/oder wie sich ältere Versionen verhalten. Auf welcher OSX-Version wurde die App ausgeführt, die nicht mit launch erstellt wurde?

Bei OSX 10.10 stimmt das Verhalten von mit der Dokumentation überein, wobei Folgendes zu beachten ist:

  • Wenn die Absicht darin besteht, zu starten und in einem Schritt auszuführen, genügt run application - es ist kein separater launch application-Befehl erforderlich.

Optionen


  • @ user309603s pragmatische Lösung verwendet einfach do Shell script MIT DEM STANDARDPROGRAMM open, um das Problem zu umgehen. Dies sollte funktionieren, unabhängig davon, ob die Anwendung AppleScript-basiert ist oder nicht:
do Shell script "open " & ¬
    quoted form of POSIX path of ¬
    alias ":path:to:applescript:apps:Shell-script-launcher.app"

  • Wenn Sie die Art der Anwendung kennen, die Sie im Vorfeld aufrufen:

    • ausführen einer AppleScript-basierten -App: Am besten verwenden Sie run script file, wie @ regulus6633 empfiehlt - dies hat den zusätzlichen Vorteil, dass die aufgerufene AppleScript-basierte Anwendung Objekte direkt an den Aufrufer zurückgeben kann:
run script file ":path:to:applescript:apps:Shell-script-launcher.app"

Hinweis: Es gibt auch load script file, mit dem Sie lediglich load Skriptcode eingeben können, ohne ihn sofort auszuführen.

run application ":path:to:applescript:apps:Shell-script-launcher.app"

Sie können dies abschwächen, indem Sie nur den spezifischen Connection invalid-Fehler selektiv ignorieren (der davon ausgeht, dass dieser Fehler nicht legitimerweise auftreten würde) [nicht mehr unter OSX 10.10 erforderlich]:

try
    run application "Macintosh HD:Applications:_Sandbox-AppleScript0.app"
on error number -609 # 'Connection is invalid' error that is spuriously reported
    # simply ignore
end try

 launch application ":path:to:applescript:apps:Shell-script-launcher.app"

Dies ist jedoch aus zwei Gründen nicht ratsam:

16
mklement0

Hast du offen probiert?

do Shell script "open 'path/to/applescript/apps/Shell-script-launcher.app' && say starting script"
4
user309603

Applescript hat den Befehl "Skript ausführen". Es funktioniert auf Applescripts oder Applescript-Anwendungen. Wenn ich also Ihre App auf meinem Desktop habe, funktioniert das ...

set appPath to (path to desktop as text) & "Shell-script-launcher.app"
run script file appPath
4
regulus6633

Setzen Sie es zwischen "try" Keywords.

try
tell application ":path:to:applescript:apps:Shell-script-launcher.app" to activate
end try
1
atonus

Speichern Sie Ihr Skript als Anwendung. Fügen Sie das gewünschte Skript im Skriptordner hinzu (siehe Pfad unten).

Führen Sie wie folgt aus, ändern Sie den Typ des Skripts, das Sie ausführen möchten ...

property theApplicationPath : the path to me as text <br/>
property theShellScriptPath : theApplicationPath & "Contents:Resources:Scripts:test.command"<br/>
property theShellScript : the quoted form of POSIX path of theShellScriptPath<br/>
<br/>
tell application "Terminal" to (do Shell script "/bin/bash " & theShellScript)
<br/>

Boom, Bob ist dein Onkel! Zumindest für mich.

1
HIram Newton

Es ist ziemlich einfach, Sie müssen nur den normalen do Shell script verwenden, zum Beispiel: 

do Shell script "open " & ¬
    quoted form of POSIX path of ¬
    alias ":path:to:applescript:apps:Shell-script-launcher.app"
1
Michael Sanders

Das mag hilfreich sein, aber ich bin kein Experte für dieses Thema. In diesem Fall fand ich das doppelte Startverhalten (auf Yosemite, ich habe keine andere Version von OS X verwendet) sehr ärgerlich.

Mit diesem Skript kann ich jederzeit ein neues Terminal starten.

if application "Terminal" is running then
    tell application "Terminal"
        activate
        do script ""
    end tell
else
    tell application "Terminal" to activate
end if
0
Peter Shannon