• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Automator-Variable festlegen und in AppleScript/ Terminal nutzen

Mac-Boy 24

Tokyo Rose
Registriert
14.08.11
Beiträge
66
Hallo zusammen.
Ich arbeite gerne mal etwas mit Automator, bin aber nicht so in den Funktionen drin wie einige von euch, deshalb hoffe ich, dass ihr mir helfen könnt :)
Es geht darum, dass ich schon einige Male eine Variable in Automator festgelegt habe und diese dann im Terminal benutzen wollte. Um aber den Terminalbefehl direkt im Automatorprogramm zu haben, benutze ich "AppleScript ausführen"
Das Beispiel im Bildschirmfoto ist zur Visualisierung gedacht, würde mich aber freuen, wenns am Ende funktioniert :-D
Bildschirmfoto Auto-Shutdown.png
Das Programm soll dann so ablaufen, dass die verbleibenden Minuten bis zum Shutdown eingegeben werden und die daraus erstellte Variable dann ins AppleScript eingebunden wird (hier lila, weil von AS nicht erkannt). Letzteres bekomme ich leider nicht hin.

Vielen Dank und liebe Grüße, Johannes
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Hallo,

man legt eine Variable in einem Arbeitsablauf fest, um sie später im weiteren Verlauf nutzen zu können. Sie enthält ("speichert") die übergebenen Ergebnisse der vorherigen Aktion.
In deinem Fall ist die Aktion "Variable festlegen" also gar nicht nötig, da die nächste Aktion ja eh die Ergebnisse der vorherigen empfängt - hier die Aktion "AppleScript ausführen". (Anmerkung: Nicht alle Aktionen empfangen die Ergebnisse der vorherigen Aktion. Man erkennt es daran, ob die Aktionen optisch verbunden sind. Manchmal ist das auch unerwünscht, dann kann man die "Eingabe dieser Aktion ignorieren".)

Der vorgegebene on run -handler bei der Aktion lautet:

on run {input, parameters}

(* Your script goes here *)

return input
end run

wobei input ein Parameter in dem AppleScript ist, welche die Liste der Ergebnisse der vorherigen Aktion enthält.
Statt +countdown müsste es also +input heißen?
Fast!
do script "sudo shutdown -h +input" würde genau so im Terminal ausgeführt werden. Um das Parameter zu übergeben schreibt man:
do script "sudo shutdown -h +" & input

Soweit dazu...
Dein Skript ist allerdings nicht ganz glücklich. Was passiert, wenn jemand einen Buchstaben, ein Sonderzeichen oder keine natürliche Zahl eingibt? Sudo - wenn nicht vorher geregelt, verlangt dein Admin Passwort. Sofern du überhaupt Admin bist....

Gruß
 
Zuletzt bearbeitet:

Pill

Adams Parmäne
Registriert
07.07.12
Beiträge
1.310
Noch ein paar Dinge:

Es gibt auch eine Aktion "Shell-Script ausführen". Um Argumente an diese Aktion übergeben zu können, musst du "Eingabe übergeben: Als Argumente" auswählen, dann ist das Argument in "$@" gespeichert. Dein Code würde dann sudo shutdown -h +$@ lauten.

Allerdings musst du – wie bereits erwähnt – bei sudo ein Passwort eingeben, in einem Skript eher unpraktisch. Bei AppleScript gibt es die Möglichkeit ein Shell Script als Administrator ausführen:

on run {input, parameters}
do shell script "shutdown -h +" & input with administrator privileges
return input
end run

Das sudo kannst/solltest du dann weglassen. Wenn du "do shell script" anstelle von "do script" verwendest, wird außerdem kein Terminal-Fenster eingeblendet und du kannst dir den visible-Quatsch sparen. Ob du dein Admin-Passwort dann im Skript speicherst, jedes mal eingibst oder einen Schlüssel im Schlüsselbund anlegst, bleibt dir überlassen.
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Hallo,

die beiden von Pill erwähnten Methoden sind natürlich richtig und ein Weg in die "richtige" Richtung!
Ich habe sie bewusst nicht erwähnt, weil es nichts mit der Fragestellung an sich zu tun hatte und außerdem -> weil das ganze dann innerhalb des Automators stattfinden würde. Der Arbeitsablauf (bzw. das Programm) rödelt dann je nach eingegebener Minutenzahl ewig....

Wenn das ganze unbedingt mit dem Automator gestartet werden soll, so wäre eine Möglichkeit, das Parameter an ein externes AppleScript Programm übergeben, welches dann startet...
Aber man könnte das ganze auch gleich in einem AppleScript Programm schreiben. Da kann man auch mit einem GUI Fenster die Minutenzahl eingeben ...

"shutdown" ist eine relativ "harte" Methode, um den Mac auszuschalten.
Was ist, wenn gerade ein Time Machine BackUp läuft? Das würde ich erstmal im Skript abfangen und sanft beenden (oder warten, bis es beendet ist).
Und alle geöffneten Programme werden ohne Sicherung beendet und ... glaube ich, beim nächsten Start wieder geöffnet.

Hmm... kann man alles abfangen, bedeutet aber ein etwas aufwändigers Skript.
Ich weiß, dass es eine Menge 3rd Party Apps gibt, die als Ausschalt-Timer gestaltet sind. Eventuell ist da ja was brauchbares dabei...

Gruß
 

Mac-Boy 24

Tokyo Rose
Registriert
14.08.11
Beiträge
66
Hallo ihr beiden. Danke für die ausführlichen Antworten!! Ich hab mich jetzt etwas durch die gezeigten Funktionen gearbeitet und dabei auch schon Verbesserungen für andere kleine Programme gefunden. Insofern hab ich schon was dazugelernt und das find ich mega klasse! :cool:
Ohne den Schritt "Nach Text fragen (Admin-Passwort)" funktioniert es schon mal ohne Probleme :-D
Auto-Shutdown Passwort variabel.png
Dann hab ich einen Schritt weiter gedacht und überlegt, wie 2 Variablen als input im Skript Verwendung finden können. Wenn das Passwort in einer Datei hinterlegt ist, ist es nicht mehr besonders sicher. Daher die Idee, dass das Passwort im Laufe des Automator-Prozesses abgefragt werden kann.
Der erste Versuch, das Problem selbst zu lösen, ging leider schief. Fehlermeldung im Schritt "set CountdownTime to input" lautet: "Die Variable 'input' ist nicht definiert" :(
Auto-Shutdown Passwortvariablen.jpg

Bitte nicht vergessen, dass es sich um ein aktuelles Beispiel handelt, was ich in einer Zeitschrift gelesen habe; ich Variablen aber auch schon vorher mal im Script gebrauchen konnte und das leider nicht geschafft habe..
Wäre schön wenn ihr mir hier nochmal Hilfestellung geben könnt, möchte das soweit gerne lernen :)
Sonnige Grüße, Johannes
 

Pill

Adams Parmäne
Registriert
07.07.12
Beiträge
1.310
Ganz so einfach geht das leider nicht. Der Automator geht schrittweise vor, das heisst, das Ergebnis der vorherigen Aktion wird immer an die nachfolgende Aktion als Eingabe übergeben. Du kannst zwar im Automator Variablen festlegen, aber diese Variablen haben nichts mit den Variablen im AppleScript zu tun (mit Ausnahme der Variablen input). Genauso wenig können verschiedene (AppleScript-)Aktionen untereinander kommunizieren, außer eben von vorheriger zu nachfolgender Aktion.

Du kannst dein Problem aber auch viel einfacher lösen. Wenn du den AppleScript-Befehl zum Herunterfahren benutzt (tell application "Finder" to shut down), dann brauchst du kein Admin-Passwort und der Rechner sollte ordentlich herunterfahren. Ob du die Wartezeit per Automator oder direkt per AppleScript abfragst, bleibt dir überlassen.

Dass das Programm während der Wartezeit läuft, finde ich gar nicht so schlecht. So lässt sich das Herunterfahren noch relativ einfach wieder abbrechen.
 

sedna

Galloway Pepping
Registriert
22.10.08
Beiträge
1.359
Hallo,

ja ... aber nicht gerade, wenn es ein Automator-Programm ist :)

Hach ja ... und das sanfte Runterfahren mit dem Finder (oder System Events) bricht natürlich ab, sofern noch geöffnete Programme eine Sicherung der Dokumente verlangen...
:eek: Ich will ja nicht pingelig erscheinen, sondern nur darauf verweisen, dass man, um das ganze sauber zu erledigen, etwas mehr Zeilen Code braucht...

So. Pill hat das ja eben recht gut erklärt.
Zu deinen Screenshots:
Jetzt wären die Aktionen "Wert der Variablen festlegen" und " Wert der Variablen abfragen" zum Einsatz gekommen.


  1. Nach Text fragen (Zeit)
  2. Variable festlegen (nennen wir sie "Zeit")
  3. Nach Text fragen (Passwort)
  4. Variable abfragen ("Zeit")
  5. AppleScript ausführen

So, Achtung:
zwischen 2. und 3. wollen wir KEINE Ergebnisse übermitteln. Sonst gibt er dir die Zeit als Antwort in Aktion 3 vor. Also in Aktion 3 in den Optionen oder mit Rechtsklick in den Kopf der Aktion "Eingabe ignorieren"

Aktion 4 empfängt das Passwort aus 3 und sendet ZUSÄTZLICH noch den gespeicherten Wert für die Zeit.
Aktion 5 empfängt also eine LISTE mit zwei Werten:
Das Passwort
Die Zeit

on run {input} -> der input ist also "hulahup","5"

um es mal mit Variablen in AppleScript zu machen:

on run {input, parameters}

-- erster Wert der Liste:
set dasPasswort to item 1 of input
-- zweiter Wert der Liste:
set dieZeit to item 2 of input

-- ohne tell app "Terminal", dazu ist ja das do shell script da
--und ohne sudo! Nicht nötig mit dieser Formulierung
do shell script "shutdown -h +" & dieZeit password dasPasswort with administrator privileges

end run