AppleScript - Variable nach jeder Ausführung überschreiben

1

1Frageee

Mitglied
Thread Starter
Dabei seit
15.10.2019
Beiträge
2
Reaktionspunkte
0
Hallo Zusammen,
Ich bin recht neu bei AppleScript und baue nun einen ersten kleinen Script. Die Besonderheit ist, dass am Anfang des scripts ein Link als Variable festgelegt wird. Während des scripts wird ein neuer Link in die Zwischenablage kopiert, woraufhin dieser mit dem ursprünglichen Link abgeglichen wird. Falls er diesem nicht entspricht, folgen einige Handlungen auf der Website und der Script ist zu Ende. Das Problem ist, dass der zweite Link beim nächsten Ausführen des Scripts als "erster" Link dienen soll, d.h. als Grundlage zum vergleich mit einem weiteren Script.

Bisher habe Ich das Problem mit UI Programmierung gelöst, was meiner Meinung nach aber keine ideale Lösung ist. Dabei "drückt" das Script am Ende über dem Quellcode cmd+f und sucht nach den ersten Buchstaben des ersten Links, wählt diesen aus, löscht die Ziffern im Quellcode und drückt setzt an diese Stelle schließlich den neuen Link ein.

Denkt Ihr es gibt da evtl. eine bessere Lösung ohne UI Programmierung? Ich hätte da z.B. an Variablen gedacht, welche Werte aus einem Datensatz nehmen, welchem diese Werte wiederum zuvor zugewiesen wurden (so eine Art größerer Zwischenspeicher)

Mich würde echt interessieren wie man so ein Problem lösen kann, im Internet findet man zu so speziellen Anliegen ja leider kaum hilfreiche Infos. Deshalb wäre Ich sehr dankbar, wenn Ihr mir da ein paar Tipps gebt oder einfach mal eure Meinung bzw. euer Wissen in die Kommentare schreibt.

Vielen Dank im Voraus!
 
du müsstest den link in einer datei speichern und beim starten des scripts halt auslesen.
falls keine datei vorhanden ist, wird sonst halt eine hart kodierte standard variable aus dem script als link gesetzt.
 
  • Gefällt mir
Reaktionen: 1Frageee
du müsstest den link in einer datei speichern und beim starten des scripts halt auslesen.
falls keine datei vorhanden ist, wird sonst halt eine hart kodierte standard variable aus dem script als link gesetzt.
Ok, das klingt ja eigentlich recht einfach. An was für eine Art von Datei denkst du denn da? Kann man da eine Textdatei nutzen oder gibt es da noch andere Möglichkeiten?

Ich meine bei einer Textdatei muss ja der Inhalt gelesen werden. Wenn das keine Schwierigkeiten bereitet, wäre das natürlich ok. Ich will es nur so simpel wie möglich halten ^^
 
Mit property z.B
Code:
property oldLink : ""
set newLink to "do soething to get the link"
if oldLink ≠ newLink then "do something"
set oldLink to newLink

Beim nächsten start des Script ist die property oldLink der letzte neue link. Funktioniert natürlich erst richtig wenn der oldLink mal gesetzt ist.
 
Zuletzt bearbeitet:
Mit property z.B
Code:
property oldLink : ""
set newLink to "do soething to get the link"
if oldLink ≠ newLink then "do something"
set oldLink to newLink

Beim nächsten start des Script ist die property oldLink der letzte neue link. Funktioniert natürlich erst richtig wenn der oldLink mal gesetzt ist.
Danke, aber wird dann wirklich der newlink als oldlink verwendet, wenn das script komplett neu ausgeführt wird? Ich meine dem oldlink wird ja jedes mal wieder der zitierte Link als property zugewiesen
Code:
property oldLink: ""
.
 
eine property wird nur beim neu kompilieren neu gesetzt.
 
Also Ich habe den Ansatz mit der property an dem angehängten code ausprobiert. Wir zweimal hintereinander der gleiche Buchstabe als PW vorgeschlagen, müssten sowohl die var oldlink als auch die var newlink diesem Buchstaben entsprechen. In diesem Fall müsste der code
"if oldLink ≠ newLink then tell application "System Events" to key code 48 using command down" nicht ausgeführt werden. Das Script dürfte also nicht zurück auf den script Taben. Stattdessen müsste es in dem Fall, dass hintereinander der gleiche Buchstabe kommt, auf dem Programm Safari bleiben. Dies funktioniert aber leider nicht. Ich bräuchte also eine Lösung, bei welcher auf "oldlink"am Ende des Skripts der Wert von "newlink" überwiesen wird. Beim neu kompilieren und neu ausführen des Skripts soll für oldlink jedoch immer der jeweils neu zugewiesene Wert verwendet werden. Das klappt mit der Property also leider nicht ideal. Oder mache ich da was falsch? Hier der Skript:

Code:
property oldLink : ""
delay 0.2
tell application "Safari" to activate
delay 3
tell application "System Events" to keystroke "t" using command down
delay 2
tell application "System Events" to keystroke "https://www.lastpass.com/de/password-generator"
delay 0.2
tell application "System Events" to key code 36
delay 3
tell application "System Events" to key code 48
delay 0.2
tell application "System Events" to key code 48
delay 0.2
tell application "System Events" to keystroke "1"
delay 0.2
tell application "System Events" to key code 48
delay 0.2
tell application "System Events" to key code 48
delay 0.2
tell application "System Events" to key code 48
delay 0.2
tell application "System Events" to keystroke "c" using command down
delay 0.5
set newLink to (the clipboard)
delay 0.5
tell application "System Events" to keystroke "w" using command down
delay 0.5
if oldLink ≠ newLink then tell application "System Events" to key code 48 using command down
delay 1
set oldLink to newLink
 
Nein!! Urgl coding! Beschreibe nochmal genau was das Script machen soll. Kurz und Schritt für Schritt. Neu kompilieren muss das Script im normalen Betrieb nicht mehr.

BEISPIEL:
Code:
tell application "Safari"
    activate
    open location "https://www.lastpass.com/de/password-generator"
end tell

Safari ist scriptfähig. Man kann dem Programm direkt sagen was man will und muss sich nicht mit Zeichensprache verständigen.
 
Zuletzt bearbeitet:
Kurzfassung: fetter Text, der Rest sind bloß weitere Infos.

Ok, also danke erstmal für die Antwort. Bin btw. noch recht neu bei AppleScript und probiere mich an dem jetzigen Projekt also eher etwas aus, möchte das aber auf jeden Fall hinbekommen.

Der erste Schritt besteht darin, eine Webseite zu öffnen. Auf dieser Website befinden sich verschiedene Elemente, die nach dem Datum an dem Sie hinzugefügt wurden, sortiert werden. Um zu überprüfen, ob ein neues Element auf die Webseite gestellt wurde, klickt mein Script auf das oberste/neuste Element, und kopiert die URL zu diesem Element. Anschließend ist es das Ziel, abzugleichen ob die kopierte URL mit der URL übereinstimmt, welche bei der letzten Ausführung des Scripts in die Zwischenablage kopiert und anschließend der variablen "OldLink" zugewiesen wurde. Dazu benutze Ich in dem Script das if-statement: .
if NewLink != OldLink then #lade verschiedene Informationen über dieses Element herunter.
. Beim nächsten Ausführen bzw. manuellen Starten des Scripts, soll sich der gleiche Vorgang wiederholen. Deshalb muss diesmal der ehemals "neue NewLink" im neuen if statement zum OldLink werden, damit wieder überprüft werden kann, ob sich an dem obersten Element der Webseite etwas geändert hat.


Ich will also bei jedem Durchlauf des Scripts 2 Werte vergleichen. Einen neuen und einen alten. Das obige Beispiel mit Lastpass habe ich nur verwendet, da dort ebenfalls immer ein neuer Wert als Passwort erscheint, welcher mit dem Passwort aus dem letzten Durchgang verglichen wird.

Bezüglich des Ui Codings stimme Ich dir zu. Bisher habe ich das Problem, dass Ich nicht wusste wie Ich es richtig sauber hinbekomme den NewLink als OldLink des nächsten "Ausführens" festzulegen, wiegesagt durch key codes, keystrokes und so etwas gelöst. Ich bin als totaler Einsteiger halt leider noch nicht so sicher darin, zu wissen welche commands man für welche Programme verwenden kann, vor allem wenn man ein so spezielles Problem wie das hier thematisierte lösen muss.

Eine Idee für eine sauberere Umsetzung war es ja bereits eine Datei abzuspeichern, auf welcher immer die zwischengespeicherte URL abgespeichert wird. Die Variable OldLink müsste dann jedes mal auf diese Datei zugreifen und sich die URL daraus holen. Eine andere Idee war ja die property, welche man OldLink zuweist. In dem Thema bin ich leider echt nicht drinnen. Den Beispielcode (von @Atalantia) für die property habe Ich ausprobiert und das hat leider beim Testen nicht funktioniert. Möglicherweise auch weil ich mit der property etwas falsch gemacht habe.

Gibt es da also vllt. eine bessere Lösung für den jetzt genauer beschriebenen Script? Oder wie genau lässt sich das dann mit der Datei oder der property in der Praxis umsetzen?

Ich wäre echt dankbar für eine Antwort, da Ich sonst im Moment wirklich nirgendwo Infos zu genau diesem Problem finden kann. Ach und hier muss sich auch niemand dazu aufgefordert fühlen, mir ein Programm zu schreiben oder so etwas^^. Es wäre aber sehr nett, wenn Ihr die Lösungsideen auch etwas genauer erklärt, so dass ich mir als Laie auch etwas genaueres darunter vorstellen kann und mir so der Einstieg in AppleScript vielleicht auch etwas leichter fällt.

Vielen Dank und Viele Grüße!
 
Zuletzt bearbeitet:
Ja eben:
erstelle property oldLink
Sage Safari "öffne Webseite"
speichere Link Neustes Element URL in variable "newLink"
wenn newLink ≠ oldLink dann
lade verschiedene Informationen über dieses Element herunter
mach oldLink = newLink

Viele Denkfehler in Deinem Text. Zwischenablage (Clipboard) brauchst Du gar nicht.
Ein bischen konsistenter ist es wenn Du ein Script-Bundle erstellst und den Link dort speicherst.
Code:
do shell script "echo " & newLink & " > quoted form of POSIX path of (path to resource "link.txt")
Auslesen dann mit:
Code:
do shell script "cat "& quoted form of POSIX path of (path to resource "link.txt")
Sollte in Deinem Fall aber nicht nötig sein. properties genügen.
 
Zuletzt bearbeitet:
Zurück
Oben Unten