[GastForen Programmierung/Entwicklung AppleScript Dateien kopieren

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Dateien kopieren

Bommi61
Beiträge gesamt: 4

25. Mai 2020, 08:50
Beitrag # 1 von 9
Bewertung:
(28009 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen, bin ganz neu im Thema AppleScript erstellen. Hab schon etwas Erfahrung in der Powershell Programmierung.

Ich benötige ein AppleScript mit dem ich Verschiedene Verzeichnis kopieren kann.
Für Powershell habe ich das schon mal erstellt aber bei AppleScript komme ich schnell an meiner grenzen.

Ich stelle mir es wie folgt:

das Verzeichnis "Dokumente" und weitere vom Mac wird auf einer Ext. Platte kopier in ein Verzeichnis mit dem Namen des Tagesdatums z.b. 25.05.20 nächste Sicherung Verzeichnis 26.05.20 usw.
nach 30 Tagen wird das erste Verzeichnis dann wieder gelöscht.
Bei PS habe ich es so gelöst, das ich in einem Verzeichnis auf der Ziel Platte ein Verzeichnis "Backup" angelegt habe mit dem Datum der Sicherungen, das Programm sucht nach dem nach dem ersten Datum im Verzeichnis Backup und löscht dann das Verzeichnis mit dem Datum (also die Sicherung die 30zig Tage alt ist) Klapp zu 90%.

Ist so etwas machbar mit AppleScript?

Über Hilfe wie ich so etwas hin bekomme würde ich mich sehr freuen.

Viele Grüße

Thilo
X

Dateien kopieren

Hans Haesler
  
Beiträge gesamt: 5826

25. Mai 2020, 09:38
Beitrag # 2 von 9
Beitrag ID: #575447
Bewertung:
(28000 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thilo,

herzlich willkommen im AppleScript-Forum auf HDS! :-)

Wenn ich es richtig verstehe, soll das Script die genannten Ordner jeden Tag in einen mit dem aktuellen Datum benannten Ordner sichern.
Dann wird das Datum des dreissig Tage vorher erstellen Ordners ausgerechnet und falls dieser vorhanden ist, wird er gelöscht.

Ich werde schon mal versuchen, diese Outline in ein Script umzusetzen.

Gruss, Hans


als Antwort auf: [#575446]

Dateien kopieren

Bommi61
Beiträge gesamt: 4

25. Mai 2020, 09:55
Beitrag # 3 von 9
Beitrag ID: #575448
Bewertung:
(27988 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

ja Du hast es richtig Verstanden. :)
Danke schon mal für deine Hilfe.

Viele Grüße

Thilo


als Antwort auf: [#575447]

Dateien kopieren

Hans Haesler
  
Beiträge gesamt: 5826

25. Mai 2020, 11:40
Beitrag # 4 von 9
Beitrag ID: #575451
Bewertung:
(27970 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thilo,

eine erste Version des Backup-Scripts.

– Die "XXX" durch den Namen Deines Macs ersetzen;
– anstelle von "thilo" Deinen Benutzernamen einsetzen;
– die "EEE" durch den Namen der externen Platte ersetzen.

Nicht ganz klar sind die Namen der Ordner. Das folgende Script erwartet einen bestehenden Ordner "Backup".
In diesem legt es heute den Ordner "25.05.2020" an und kopiert die Ordner der Liste hinein.
Dann löscht es den Ordner "25.04.2020" (falls vorhanden).

Code
(* 
BackupScript.scpt
© 25.05.2020 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
*)

# das aktuelle Datum
set curDate to current date
set dd to day of curDate
set mm to text -2 thru -1 of ("0" & (month of curDate as number))
set yyyy to year of curDate
set actString to "" & dd & "." & mm & "." & yyyy

# das "alte" Datum (aktuell minus 30 Tage)
set oldDate to ((current date) - 30 * days)
set od to day of oldDate
set om to text -2 thru -1 of ("0" & (month of oldDate as number))
set oyyy to year of oldDate
set oldString to "" & od & "." & om & "." & oyyy

# die Liste der zu kopierenden Ordner
set folderList to {"XXX:Users:thilo:Documents", "XXX:Users:thilo:Documents:Test1", "XXX:Users:thilo:Documents:Test2", "HighSierra:Users:thilo:Documents:Test3"}

# der Pfad zum Backup-Ordner
set backupFolder to "EEE:Backup"

# den aktuellen Ordner erzeugen
tell application "Finder"
set targetFolder to (make new folder at folder backupFolder with properties {name:actString}) as string
end tell

# die Ordner kopieren
tell application "Finder" to duplicate folderList to folder targetFolder

# den "alten" Ordner entfernen
try
tell application "Finder" to delete folder oldString of folder backupFolder
activate me
display dialog "Fertig." buttons "OK" default button 1 with icon 1
on error
activate me
display dialog "Alter Ordner nicht gefunden." buttons "OK" default button 1 with icon 2
end try

Gruss, Hans


als Antwort auf: [#575448]

Dateien kopieren

Bommi61
Beiträge gesamt: 4

25. Mai 2020, 13:00
Beitrag # 5 von 9
Beitrag ID: #575455
Bewertung:
(27945 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

Danke für deine schnelle Antwort. ich bekomme aber leider eine Fehler Meldung:
error "„Finder“ hat einen Fehler erhalten: Die Routine kann Objekte dieser Klasse nicht bearbeiten." number -10010

Verstehe ich es richtig, das ich jedes Unterverzeichnis einzeln eintragen muss? Gibt es die Möglichkeit von "*" das alle Unterverzeichnis mit kopiert werden?

Viele Grüße
Thilo


als Antwort auf: [#575451]

Dateien kopieren

Hans Haesler
  
Beiträge gesamt: 5826

25. Mai 2020, 13:29
Beitrag # 6 von 9
Beitrag ID: #575456
Bewertung:
(27930 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thilo,

bitte sehr.

ich muss gleich weg. Deshalb nur kurz: Ich hatte verstanden, dass der Ordner "Dokumente" und ein paar andere kopiert werden sollen. Deshalb die Liste mit den Pfaden zu jedem einzelnen.

Wenn nur vom Ordner "Dokumente" ein Backup erstellt werden soll, dann ist es natürlich einfacher.

Würdest Du mir bitte Dein Script zustellen? An die Adresse in meinem Profil. Dann könnte ich vermutlich herausfinden, wo es klemmt.

Gruss, Hans


als Antwort auf: [#575455]

Dateien kopieren

Hans Haesler
  
Beiträge gesamt: 5826

25. Mai 2020, 18:27
Beitrag # 7 von 9
Beitrag ID: #575467
Bewertung:
(27888 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thilo,

ich habe das Problem nachvollziehen können.

Die Fehlermeldung wird gezeigt, weil die Ordner "1" und "Test2" und "Test3" vermutlich nicht existieren. Zudem ist im vierten Pfad der Name meines Rechners drin geblieben. Mein Fehler.

Versuche es bitte mal nur mit dem Ordner "Dokumente":

Code
(* 
BackupScript_02.scpt
© 25.05.2020 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
*)

# das aktuelle Datum
set curDate to current date
set dd to day of curDate
set mm to text -2 thru -1 of ("0" & (month of curDate as number))
set yyyy to year of curDate
set actString to "" & dd & "." & mm & "." & yyyy

# das "alte" Datum (aktuell minus 30 Tage)
set oldDate to ((current date) - 30 * days)
set od to day of oldDate
set om to text -2 thru -1 of ("0" & (month of oldDate as number))
set oyyy to year of oldDate
set oldString to "" & od & "." & om & "." & oyyy

# der zu kopierende Ordner
set curFolder to "Macintosh:Users:tbo:Documents"

# der Pfad zum Backup-Ordner
set backupFolder to "Sich_3:Backup"

# den aktuellen Ordner erzeugen
tell application "Finder"
set targetFolder to (make new folder at folder backupFolder with properties {name:actString}) as string
end tell

# den Ordner kopieren
tell application "Finder" to duplicate folder curFolder to folder targetFolder

# den "alten" Ordner entfernen
try
tell application "Finder" to delete folder oldString of folder backupFolder
activate me
display dialog "Fertig." buttons "OK" default button 1 with icon 1
on error
activate me
display dialog "Alter Ordner nicht gefunden." buttons "OK" default button 1 with icon 2
end try

Solange sich im Backup-Ordner noch kein Ordner befindet, welcher "alt genug" ist, wird am Schluss ein Dialog die Warnung verkünden: "Alter Ordner nicht gefunden."

Deshalb sollte für einen ersten Test im Backup zuvor der Ordner "25.04.2020" manuell erzeugt werden. Morgen wäre es "26.04.2020", übermorgen "27.04.2020" usw.

Doch vielleicht sollte das Konzept geändert werden: Der älteste Ordner im Backup wird gelöscht. Aber nur, wenn er ein gewisses Alter hat.

Also nicht den Namen berücksichtigen. Es kann doch vorkommen, dass an einem Tag kein Backup erstellt wird. Und dann würde am nächsten Tag der zweitälteste Ordner entfernt.

Gruss, Hans


als Antwort auf: [#575455]

Dateien kopieren

Hans Haesler
  
Beiträge gesamt: 5826

26. Mai 2020, 22:54
Beitrag # 8 von 9
Beitrag ID: #575478
Bewertung:
(27769 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thilo,

eine neue Version mit ein paar Änderungen:

1. Anstelle von "26.05.2020" wird der Name eines Ordners so zusammengesetzt: "2020_05_26".
Das "Umdrehen" ist notwendig, weil der zu entfernende Ordner nicht durch den Namen, welcher dem Datum "vor 30 Tagen" entspricht, bezeichnet wird.
Wegen folgender Überlegung: Wenn mit der bisherigen Lösung an einem Tag kein Backup erzeugt wird, dann würde am nächsten Tag der zweitälteste Ordner entfernt werden.
Die Punkte sind durch Underscores ersetzt, weil sonst der letzte Zahlenwert als Suffix behandelt wird.

2. Das 30 Tage zurückliegende Datum wird nicht mehr errechnet. Aus demselben Grund: Wenn ein Backup ausfiel, würde ein falscher Ordner entfernt werden.
Nun ist der zu entfernende Ordner ganz einfach der erste im Backup-Ordner, sobald dieser mehr als 30 Ordner enthält.

3. Wenn das Script diesen ersten Ordner direkt entfernen würde, könnte es sein, dass es nicht der erste ist. Was soll das?!? Mit "Mojave" wurde die verlangte Liste der Ordner nicht mehr in alphabetischer Ordnung zurückgegeben. Ob es mit "Catalina" immer noch so ist, kann ich nicht prüfen. Werden wir nachholen.
Zuerst wird der Finder gebeten, die Namen der Ordner aufzulisten. Sicherheitshalber wird diese Liste an einen Handler geschickt, welcher sie sortiert zurückgibt. Dann ist das erste Element der Liste der Name des zu löschenden Ordners.

4. Analog Deinem Wunsch in unserem privaten Austausch werden die Ordner "Dokumente" und "Musik" kopiert. Deshalb werden deren Pfade in eine Liste gesetzt.

Das nachfolgende Script habe ich im Format "Programm" gesichert und es unten angehängt. Somit muss es nicht ab "Script Editor" gestartet werden. Es genügt ein Doppelklick auf das Icon des Scripts.

Code
(* 
BackupScript_03.scpt
© 26.05.2020 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
*)

# das aktuelle Datum
set curDate to current date
set dd to day of curDate
set mm to text -2 thru -1 of ("0" & (month of curDate as number))
set yyyy to year of curDate
set actString to "" & yyyy & "_" & mm & "_" & dd

# die Liste der zu kopierenden Ordner
set folderList to {"Macintosh HD:Users:tbo:Documents", "Macintosh HD:Users:tbo:Music"}

# der Pfad zum Backup-Ordner
set backupFolder to "Sich_3:Backup"

# den aktuellen Ordner erzeugen
tell application "Finder"
try
set targetFolder to (make new folder at folder backupFolder with properties {name:actString}) as string
on error
set targetFolder to (backupFolder & actString) as string
end try
end tell

# die Ordner kopieren
tell application "Finder" to duplicate folderList to folder targetFolder with replacing

# die Namer der Ordner auflisten, welche sich in "Backup" befinden ...
tell application "Finder"
set backList to name of every folder of folder backupFolder
end tell
# ... und zählen
set nItems to count backList

# wenn mehr als 30 Ordner
if nItems is greater than 30 then
# die Liste zum Sortier-Handler schicken
set namesList to quickSort(backList, 1, nItems)
# den ersten Ordner in "Backup" entfernen
try
tell application "Finder" to delete folder (item 1 of namesList) of folder backupFolder
end try
end if

# den Anwender informieren
activate me
display dialog "Fertig." buttons "OK" default button 1 with icon 1

#######################################################
# der Handler, welcher die Namen sortiert
on quickSort(a, L, R)
script
property namesList : a
end script
tell result
set ctr to L
set n to R
set aRef to item L of its namesList
repeat while ctr < n
repeat while (aRef < item n of its namesList) and (ctr < n)
set n to n - 1
end repeat
if n is not ctr then
set item ctr of its namesList to item n of its namesList
set ctr to ctr + 1
end if
repeat while (aRef > item ctr of its namesList) and (ctr < n)
set ctr to ctr + 1
end repeat
if n is not ctr then
set item n of its namesList to item ctr of its namesList
set n to n - 1
end if
end repeat
set item n of its namesList to aRef
if L < n then
quickSort(its namesList, L, n - 1)
end if
if R > ctr then
quickSort(its namesList, ctr + 1, R)
return its namesList
end if
end tell
end quickSort

Gruss, Hans


als Antwort auf: [#575455]
(Dieser Beitrag wurde von Hans Haesler am 27. Mai 2020, 11:56 geändert)

Anhang:
BackupScript_03.zip (8.06 KB)

Dateien kopieren

Hans Haesler
  
Beiträge gesamt: 5826

29. Mai 2020, 08:40
Beitrag # 9 von 9
Beitrag ID: #575511
Bewertung:
(27571 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Scripter,

dank Thilo wissen wir nun, dass unter "Catalina" das vorsorgliche Sortieren der Liste der Ordnernamen nicht notwendig ist.
Seine Rückmeldung nach dem Ausführen von zwei kurzen Testscripts bestätigt dies.

Und er hat auch das Script zum Laufen gebracht. Ende gut, alles gut! :-)

Gruss, Hans


als Antwort auf: [#575478]
X