Aufruf einer AppleScript-Applikation mit Argumenten

Atelis

Akerö
Registriert
01.03.07
Beiträge
1.835
Hallo liebe Community,

ich versuche seit einigen Tagen eine AppleScript-Applikation vom Terminal aus mit Argumenten aufzurufen. Dabei soll ein neuer Prozess gestartet werden, damit ich den Aufrufer beenden kann. Mein AppleScript sieht so aus:
Code:
on run argv
    set c to 0
    try
        set c to (count of argv)
    end try
    display dialog "number of args: " & c buttons {"OK"} default button 1 with icon 1 with title ""
   
    if c < 1 then
        return
    end if
   
    set theArg to item 1 of argv
   
    ...
end run



Folgendes habe ich bisher versucht:
Code:
osascript program.app/Contents/Resources/Scripts/main.scpt 'my Arg'


Funktioniert, ruft allerdings nur das Skript auf und startet kein eigenständiges Programm.


Code:
open program.app --args 'my Arg'


Bei dieser Variante wird die Applikation gestartet, allerdings werden die Argumente nicht übertragen.


Weiß jemand, was ich falsch mache oder wie ich mein Problem lösen kann?

Google habe ich vorher natürlich bemüht, aber keine weiteren Möglichkeiten gefunden ...

Danke und viele Grüße!
 
Zuletzt bearbeitet:

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.358
Hallo,

osascript ist ein "command line tool". Die man page beschreibt es besser, als ich es kann. Kurz: es kann Applescript ausführen, und zwar direkt eingegebenen Code oder aus einer .scpt (oder auch unkompilierten .applescpt) Datei. Übrigens hätte in deinem Beispiel auch schon -> osascript program.app gereicht. Mal ganz dumpf zusammengefasst: nicht dein Skript wird aufgerufen, der Inhalt wird von osascript ausgeführt.
Natürlich könnte man mit osascript auch ein Programm starten... allerdings würde der osascript Prozess auch dann erst beendet werden, wenn auch das Programm geschlossen wird.

Aus der man page:
Any arguments following the script will be passed as a list of strings to the direct parameter of the "run" handler.
Ok, das funktioniert also soweit.

Ein AppleScript oder Automator Programm erwartet als Eingabe einen gültigen Pfad zu einer Datei(en) oder einem Ordner(n).
Dafür sind sie gemacht! Ansonsten passiert nichts oder es gibt eine Fehlermeldung. Du kennst eventuell AppleScript/Automator Programm-Droplets, auf denen Dateien/Ordner gezogen werden können....
Übrigens bräuchte man dafür einen on open Händler. Dein Skript mit on open argv als Programm gespeichert, sollte als Droplet funktionieren.

Also kann open program.app --args 'my Arg' nicht funktionieren. (Zumal bei AppleScript noch ein anderes Problem der Art der erwarteten Pfade hinzukommt)

Öffne doch mal den Automator, erstelle einen Workflow mit der Aktion AppleScript Ausführen", füge dein Skript ein (so wie es ist als on run argv Händler) und spiele ruhig mal mit weiteren vorangestellten Aktionen, was passiert. Dann speichere es mal (ohne weitere Aktionen) als Programm! Oh ja, da steht dann: das Programm erwartet Ordner oder Dateien als Eingabe!
Öffne dein Terminal:
open Pfad/zum/Automatorprogramm --args 'Pfad/zu/einer/Datei' 'Pfad/zu/einer/weiteren/Datei'
Das Automatorprogramm funktioniert (auch) als on open Händler und akzeptiert auch Posix Pfade

Hoffe, du siehst etwas klarer!
Dann wirst du eventuell auch dahinter steigen:
Dein Skript mit on open argv als Programm gespeichert, kann von einem weiteren Skript folgendermaßen mit Argumenten gefüttert werden:
Code:
tell application "program.app" to open {1, 2}
:cool:


Problem lösen?
Geht bestimmt. Kommt drauf an, was genau du vor hast. Beispiel

Terminal:
Code:
defaults write de.atelis.myapp "myArgs" '12345'; open Pfad/zu/programm.app

Dein Programm.app
Code:
on run
    do shell script "defaults read de.atelis.myapp \"myArgs\""
    set x to result
    set c to count of x
    display dialog c
end run
.

Gruß
 
Zuletzt bearbeitet:

Atelis

Akerö
Registriert
01.03.07
Beiträge
1.835
Hi sedna,

vielen Dank für deine Erklärung. Ich konnte allerdings noch nicht nachvollziehen, warum ein AppleScript-Programm (nicht Automator-Aktion) zwingend einen Pfad zu einer Datei oder einem Ordner braucht. Wenn ein AppleScript-Programm (eingepacktes Skript) ausgeführt werden soll, an welcher Stelle werden dann Eingabe-Parameter gebraucht? Oder meinst du den Pfad zum Skript?

Die Lösung über eine Konfigurations-Datei wäre eine Möglichkeit, finde ich aber zu viel Aufwand für einen Programmaufruf mit Argumenten.

Der Tipp mit dem "open" Handler war sehr hilfreich. Ich habe das Skript angepasst und jetzt kann ich von der Konsole aus nun folgende Befehle ausführen, die das gewünschte Ergebnis bringen:

Entweder:
Code:
osascript -e 'ignoring application responses' -e 'tell application "program.app" to open {"test", "test2"}' -e 'end ignoring'



Oder anders:
Code:
osascript -e 'tell application "program.app" to open {"test", "test2"}' & >/dev/null 2>&1



Vielleicht gibt es noch einen eleganteren Weg, außer ein AppleScript-Programm in dieser Form aufzurufen, aber so funktioniert es wie gewünscht. Mein späteres Programm kann diese Zeile ausführen und sich direkt danach beenden und wartet nicht auf den Rückgabewert meiner "program.app".

Viele Grüße!
 
Zuletzt bearbeitet:

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.358
He he,

deine Lösung hätte ich als nächstes vorgeschlagen...wollte es sogar zuerst noch mit anmerken :cool:
Wobei ich die zweite Variante geschrieben hätte...deine erste aber in meinen Augen die elegantere ist!


Ich bin nicht so gut darin, Dinge kurz auf den Punkt gebracht zu beschreiben. Ausserdem glänze ich eher durch Halbwissen und ziehe meine Erkenntnisse nur aus eigenen Erfahrungen. Deshalb kam der Vorschlag, mal mit dem Automator zu spielen... und auch der Hinweis auf Droplets.
Zumindest alle Mac Apps - auch eigene Automator Apps - erhalten ein "Sich Öffnen" Befehl, wenn Dateien/Ordner auf sie gezogen werden (bei einem AppleScript Droplet mit dem open handler). Die Apps liegen im Finder und können nur Finder Objekte empfangen. Was auch sonst?
Ist in der Einstellungsdatei des Apps festgelegt, welche Art von Dateien empfangen werden können, so kann das App auch (sofern ein entsprechender run handler enthalten) mit Rechtsklick auf solch eine Datei und -> Öffnen mit geöffnet werden. Aber es läuft immer auf das gleiche hinaus: Finder Objekte

Um auch andere ->Argumente zu öffnen (-> hier eine Liste), muss man es der App schon definitiv "sagen"

Naja..nicht wirklich gut erklärt...
Eventuell meldet sich ja noch jemand vom Fach :p

Gruß