Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Parameterübergabe an ein AppleScript

Parameterübergabe an ein AppleScript

Agrajag14.03.0516:03
Wenn ich ein AppleScript mit Parameter aufrufe, wie komme ich an die Parameter dran? In welcher Variable stecken sie?
<br>
<br>Entweder ich benutze die Falschen Schlagworte bei der Suche, oder die Dokus schweigen sich darüber beharrlich aus. Irgendwie komme ich mit den Dokus zu AppleScript sowieso nicht so recht klar...
0

Kommentare

Michael Schmidt
Michael Schmidt14.03.0517:30
Wie rufst du denn das Applescript mit Parametern auf?
<br>
<br>CU
<br>Schmiddl
„Trautman: "Er wird kommen und er wird mich hier rausholen." Russischer Offizier: "Was, glaubt dieser Mann, wer er ist? Gott?" Trautman: "Nein, Gott kennt Gnade!"“
0
Agrajag14.03.0517:42
run script "Panther:Volumes:Users:mike:Library:Scripts:IR Scripts:main.scpt" with parameters {"circle"}
<br>
<br>Der Aufruf funktioniert soweit. Ich will jetzt nur in main.scpt den Parameter haben.
<br>
<br>Gibt es eine Variable, in der das Home-Verzeichnis steht? Den kompletten Pfad nennen zu müssen finde ich reichlich unelegant. Am besten wäre es, wenn ich relative (also von diesem Script ausgehende) Pfadangaben benutzen könnte.
<br>
0
Agrajag14.03.0517:45
Ach so: Der Aufruf erfolgt aus einem anderen Script. Ich hab die Keyspan-IR-Fernbedienung. Jede Taste soll ein AppleScript starten, welches wiederum immer main.scpt mit einem entsprechendne Parameter aufruft.
<br>
0
Agrajag14.03.0517:46
Ich muß diese Verrenkung leider machen, weil ich mit dem Keyspan-Tool einem AppleScript keine Parameter übergeben kann.
0
Michael Schmidt
Michael Schmidt14.03.0517:57
Also hier findest du "path to"
<br>
<br>Beispiel: Du hast main.scpt auf dem Schreibtisch, dann kannst du es mit:
<br>(path to desktop as string) & "main.scpt" ansprechen.
<br>
<br>Ich gucke mal wg. der Parameter...
<br>
<br>Melde mich gleich wieder!
<br>
<br>CU
<br>Schmiddl
„Trautman: "Er wird kommen und er wird mich hier rausholen." Russischer Offizier: "Was, glaubt dieser Mann, wer er ist? Gott?" Trautman: "Nein, Gott kennt Gnade!"“
0
Michael Schmidt
Michael Schmidt14.03.0518:10
Ah!
<br>Mit run script kannst du Applescript anweisen, zu versuchen normalen Text als Applescript auszuführen:
<br>
<br>Beispiel:
<br>run script "on run x
<br>display dialog x
<br>end" with parameters {"agrajag"}
<br>
<br>Auch komplette files kannst du als Applescript ausführen:
<br>run script "Panther:Volumes:Users:mike:Library:Scripts:IR Scripts:main.scpt" with parameters {"circle"}
<br>
<br>Im main.scpt muss jetzt nur ein
<br>on run params
<br>8-)8-)
<br>stehen und du kannst diese parameter dann mit z.B.
<br>
<br>on run uebergabeParameter
<br> repeat with param in uebergabeParameter
<br> display dialog param as string
<br> end repeat
<br>end run
<br>
<br>verarbeiten!
<br>
<br>Viel Spass damit!
<br>Schmiddl
„Trautman: "Er wird kommen und er wird mich hier rausholen." Russischer Offizier: "Was, glaubt dieser Mann, wer er ist? Gott?" Trautman: "Nein, Gott kennt Gnade!"“
0
Michael Schmidt
Michael Schmidt14.03.0518:13
Der Pfad zum User Library-Ordner:
<br>run script (path to library folder from user domain as string) & "Scripts:IR Scripts:main.scpt" with parameters {"circle"}
<br>
<br>
<br>CU
<br>Schmiddl
„Trautman: "Er wird kommen und er wird mich hier rausholen." Russischer Offizier: "Was, glaubt dieser Mann, wer er ist? Gott?" Trautman: "Nein, Gott kennt Gnade!"“
0
Agrajag14.03.0518:26
Erstmal zu den Parametern: Irgendwie komme ich damit nicht klar. Hier mal der Anfang von main.scpt:
<br>
<br>- - - - - - - - - - -
<br>
<br>property listOfApps : {"iTunes", "VLC", "DVD Player"}
<br>property currentAppNr : length of listOfApps
<br>property currentApp : (item currentAppNr of listOfApps)
<br>property optionsFile : "Temporary Items:501:TemporaryItems:IRScripts_CurrentApp"
<br>property lastKeypress : 0
<br>
<br>tell application "GrowlHelperApp"
<br> set the notifications to {"Sleep", "Circle", "Other Keys"}
<br> set the enabledNotifications to {"Sleep", "Switch", "Other Keys"}
<br> register as application "IR Scripts" all notifications notifications default notifications enabledNotifications
<br>end tell
<br>
<br>
<br>set param to ??????????????
<br>
<br>if param = "stop" then pressedStop()
<br>if param = "play" then pressedPlay()
<br>if param = "pause" then pressedPause()
<br>if param = "previous" then pressedPrevious()
<br>if param = "next" then pressedNext()
<br>if param = "rewind" then pressedRewind()
<br>if param = "ffwd" then pressedFfwd()
<br>
<br>if param = "circle" then pressedCircle()
<br>if param = "menu" then pressedMenu()
<br>
<br>if param = "volup" then pressedVolUp()
<br>if param = "voldown" then pressedVolDown()
<br>if param = "mute" then pressedMute()
<br>
<br>- - - - - - - - - - -
<br>
<br>Was muß ich nun bei "set param to " scheiben? Das AppleScript Language Guide von Apple schreibt auch nichts über "on script params". Dieses Guide verrät sowieso nichts
<br>
<br>---
<br>
<br>Zu den Pfaden: Kann ein Script denn nicht seinen eigenen Pfad abfagen? Ich hab jetzt erst mal das hier gebaut:
<br>
<br>- - - - - - - - - - -
<br>
<br>set scriptName to (path to scripts folder from user domain as string) & "IR Scripts:main.scpt"
<br>
<br>run script scriptName with parameters {"menu"}
<br>
<br>- - - - - - - - - - -
<br>
<br>Auf jeden Fall, erstmal danke.
<br>
0
Michael Schmidt
Michael Schmidt14.03.0518:34
Ach so
<br>Probier mal so:
<br>------------------------------------------------
<br>property listOfApps : {"iTunes", "VLC", "DVD Player"}
<br>property currentAppNr : length of listOfApps
<br>property currentApp : (item currentAppNr of listOfApps)
<br>property optionsFile : "Temporary Items:501:TemporaryItems:IRScripts_CurrentApp"
<br>property lastKeypress : 0
<br>
<br>on run givenParameters
<br>
<br>tell application "GrowlHelperApp"
<br>set the notifications to {"Sleep", "Circle", "Other Keys"}
<br>set the enabledNotifications to {"Sleep", "Switch", "Other Keys"}
<br>register as application "IR Scripts" all notifications notifications default notifications enabledNotifications
<br>end tell
<br>
<br>
<br>set param to item 1 of givenParameters
<br>
<br>if param = "stop" then pressedStop()
<br>if param = "play" then pressedPlay()
<br>if param = "pause" then pressedPause()
<br>if param = "previous" then pressedPrevious()
<br>if param = "next" then pressedNext()
<br>if param = "rewind" then pressedRewind()
<br>if param = "ffwd" then pressedFfwd()
<br>
<br>if param = "circle" then pressedCircle()
<br>if param = "menu" then pressedMenu()
<br>
<br>if param = "volup" then pressedVolUp()
<br>if param = "voldown" then pressedVolDown()
<br>if param = "mute" then pressedMute()
<br>
<br>end run
<br>------------------------------------------------
<br>
<br>Mit dem Verzeichnis guck ich mal...
<br>
<br>CU
<br>Schmiddl
„Trautman: "Er wird kommen und er wird mich hier rausholen." Russischer Offizier: "Was, glaubt dieser Mann, wer er ist? Gott?" Trautman: "Nein, Gott kennt Gnade!"“
0
Michael Schmidt
Michael Schmidt14.03.0518:43
Die Zauberanweisung heisst:
<br>path to current application
<br>
<br>Zu beachten ist hierbei leider, dass die gelieferte Pfadangabe
<br>
<br>1. nicht den Ordner, sondern die Datei liefert, man muss also den Ordner noch herausfiltern
<br>
<br>2. nur dann stimmt, wenn das Script als Programm gesichert wird, sonst wird als current application nur der Script Editor geliefert, der die Ausführung ja sozusagen kapselt
<br>
<br>CU
<br>Schmiddl
„Trautman: "Er wird kommen und er wird mich hier rausholen." Russischer Offizier: "Was, glaubt dieser Mann, wer er ist? Gott?" Trautman: "Nein, Gott kennt Gnade!"“
0
Agrajag14.03.0519:08
Woher hast du diese Informationen? Ich finde soetwas einfach nicht.
<br>
<br>OK, das mit den Parametern klappt jetzt. Zuerst dachte ich, es klappt nicht, aber dann fiel mir auß, daß ich das Main-Script so ja nur noch über die anderen Scripte starten kann
<br>
<br>Das mit den Script-Bundle nützt mir nichts. Also kann ich von einem normalen Script nicht den Speicherort erfragen.
<br>
<br>
<br>
<br>Wo wir schon dabei sind
<br>
<br>Kann man AppleScript dazu bringen, daß es sich die Variablem in main.scpt merkt, wenn es von einem anderen Script aufgerufen wird. Wenn ich main.scpt direkt starte, dann haben alle Variablem auch beim nächsten Ausführen ihre Werte. Sobald main.scpt z.B. von menu-scpt gestartet wird, dann haben alle Variablen die Werte, wie sie von den Properties vorgegeben werden.
<br>
<br>Hintergrund: Ich hab eine Taste als Programmumschalter belegt. Mit ihr kann ich zwischen den Programmen wählen, die in den Properties definiert wurden (listOfApps). Alle Aktionen der Fernbedienung beziehen sich dann auf das aktuell gewählte Programm. Deswegen benutze ich auch Growl -- damit ich weiß, in welchem &rsquo;Modus&rsquo; sich die Fernbedienung befindet.
<br>
0
Michael Schmidt
Michael Schmidt15.03.0511:37
agrajag
Woher hast du diese Informationen? Ich finde soetwas einfach nicht.
<br>
<br>
<br>Ich habe hier ein schlaues Buch neben mir liegen
<br>http://www.amazon.de/exec/obidos/ASIN/1590594045/qid%3D1110878861/302-6036622-1426405
<br>
<br>
<br>Kann man AppleScript dazu bringen, daß es sich die Variablem in main.scpt merkt, wenn es von einem anderen Script aufgerufen wird. Wenn ich main.scpt direkt starte, dann haben alle Variablem auch beim nächsten Ausführen ihre Werte. Sobald main.scpt z.B. von menu-scpt gestartet wird, dann haben alle Variablen die Werte, wie sie von den Properties vorgegeben werden.
<br>
<br>
<br>Das Problem ist, das bei run script eine einzelne Instanz des aufgerufenen Scripts erstellt wird und jede Instanz seine eigenen Properties verwaltet, bei z.B. vier Aufrufen von main durch "run script" jeweils vier eigenständige "Kopien" erstellt werden.
<br>
<br>Mir fallen da zwei Möglichkeiten ein:
<br>
<br>1. Du schreibst dir bestimmte Werte in ein kleines Textfile (z.B. im Library-Ordner) vermerkst dir dort die zu speichernden Werte mit Leerzeichen getrennt. Dann kannst du den Inhalt gut auseinander nehmen und die Werte wieder heraus lesen
<br>
<br>2. Du kannst die Werte im aufrufenden Script ändern lassen. Dort bleiben die in den Properties gespeicherten Werte dann erhalten. Ich glaube mit "parent" geht das.
<br>
<br>CU
<br>Schmiddl
„Trautman: "Er wird kommen und er wird mich hier rausholen." Russischer Offizier: "Was, glaubt dieser Mann, wer er ist? Gott?" Trautman: "Nein, Gott kennt Gnade!"“
0
Agrajag03.06.0512:00
So, nach langer, langer Zeit hab ich mal wieder Gelegenheit gehabt an meinem IR-Script weiter zu basteln.
<br>
<br>Der Stand:
<br>
<br>Seit Tiger kann man beim Shell-Befehl osascript an das aufzurufende Script auch Parameter übergeben. Ich habe nun für jede Taste der Fernbedienung ein Shellscript mit einem Aufruf wie
<br>
<br>osascript "/Volumes/Users/mike/Library/Scripts/IR Scripts/main.scpt" play
<br>
<br>Leider mag osascript wohl keine Pfadangaben dem Tilde (~), weshalb ich leider absolute Pfade angeben muß.
<br>
<br>Die Shell-Scripte hab ich in ein App-Bundle verpackt, da sonst bei jedem Tastendruck ein Shellfenster geöffnet wird.
<br>
<br>Die eigendliche Arbeit macht das AppleScript main.scpt. Das Ganze funktioniert soweit auch sehr schön. Ich hab z.B. eine Taste so belegt, daß sie erst den Rechner schlafen schickt, wenn ich die Taste zweimal in Folge drücke. Stop stoppt den jeweiligen Player, zweimal in Folge gedrückt beendet es das Programm. Play, Next und Previous zeigen auch den laufenden Titel an, wenn iTunes läuft. Alle Ausgaben laufen über Growl.
<br>
<br>Das einzige, was ich gerne noch geändert hätte, wofür ich bislang aber noch keine Lösung gefunden habe:
<br>
<br>Ich würde gerne das HauptScript (main.scpt) über kleine AppleScripte aufrufen, weil die einzelne Scripte nach dem erstmaligen Gebrauch im Speicher verbleiben und bei folgenden Tastendrücken nicht mehr geladen werden müssen (keine Plattenzugriffe deutlich schneller). Jedes Script sieht etwa so aus:
<br>
<br>run script (path to scripts folder from user domain as string) & "IR Scripts:main.scpt" with parameters {"play"}
<br>
<br>Nur leider bekomme ich zur Laufzeit immer den Fehler
<br>
<br>> „“:”“ kann nicht diesem „Identifier“ folgen.
<br>
<br>Und ich weiß nicht wieso -- und vorallem: was will mir dieser Fehler sagen?. Ich meine, daß genau diese Befehlszeile schon funktioniert hat (damals noch unter Panther).
<br>
<br>Dann wäre immer noch das Problem, daß ich in main.scpt mehrere Properties angelegt habe. In meinen früheren Versuchen wurde jeder Tastendruck als komplett eigenständige Instanz (incl. main.scpt) behandelt, so daß die Properties nichts gebracht haben (ich merke mir u.a. welches Programm aktuell bedient werden soll). Dann müsste ich die Properties immer über eine Datei im- und exportieren -- dann kann ich auch die jetzige Lösung (Aufruf über Shellscripte) behalten (die dann sogar etwas eleganter ist). So wie ich das verstanden habe würde mir "parent" auch nichts bringen.
<br>
<br>Hat jemand vielleicht noch eine Idee, wie ich das lösen könnte? Ich hoffe ich konnte den Stand verständlich rüberbringen.
<br>
<br>PS: falls jemand Interesse an IR-Scripts hat, einfach melden.
0
Michael Schmidt
Michael Schmidt03.06.0513:13
agrajag
<br>
<br>Das einzige, was ich gerne noch geändert hätte, wofür ich bislang aber noch keine Lösung gefunden habe:
<br>
<br>Ich würde gerne das HauptScript (main.scpt) über kleine AppleScripte aufrufen, weil die einzelne Scripte nach dem erstmaligen Gebrauch im Speicher verbleiben und bei folgenden Tastendrücken nicht mehr geladen werden müssen (keine Plattenzugriffe deutlich schneller). Jedes Script sieht etwa so aus:
<br>
<br>run script (path to scripts folder from user domain as string) & "IR Scripts:main.scpt" with parameters {"play"}
<br>
<br>Nur leider bekomme ich zur Laufzeit immer den Fehler
<br>
<br>> „“:”“ kann nicht diesem „Identifier“ folgen.
<br>
<br>
<br>
<br>Probiere doch erst mal ein
<br>set thePath to (path to scripts folder from user domain as string) & "IR Scripts:main.scpt"
<br>display dialog thePath
<br>
<br>und überprüfe dann die Richtigkeit. Vielleicht ist da ein Fehler
<br>:-/
<br>
<br>Sonst sieht das ganze eigentlich ganz gut aus
<br>
<br>CU
<br>Schmiddl
„Trautman: "Er wird kommen und er wird mich hier rausholen." Russischer Offizier: "Was, glaubt dieser Mann, wer er ist? Gott?" Trautman: "Nein, Gott kennt Gnade!"“
0
Agrajag03.06.0513:33
Der Pfad lautet
<br>
<br>"Users:mike:Library:Scripts:IR Scripts:main.scpt"
<br>
<br>Der Unix-Pfad ist
<br>
<br>/Volumes/Users/mike/Library/Scripts/IR Scripts/main.scpt
<br>
<br>Ich kann die Datei auch mit
<br>
<br>tell application "Finder" to select thePath
<br>
<br>auswählen lassen. Die Referenz stimmt also.
<br>
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.