[GastForen Programmierung/Entwicklung AppleScript Dateien kopieren, wenn sie im Ordner angekommen sind ...

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

Dateien kopieren, wenn sie im Ordner angekommen sind ...

swish
Beiträge gesamt: 75

17. Apr 2005, 12:21
Beitrag # 1 von 16
Bewertung:
(5408 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Und eine letzte Frage für heute:

Ich möchte einen OS 9 Rechner damit beauftragen Dateien zu kopieren, sobald diese in einen bestimmten Ordner gelegt werden. Nach dem Kopiervorgang soll dann die Quelldatei gelöscht werden.

Mein Skript sieht folgendermaßen aus:

set InOrdner to "restore:In:"
set OutOrdner to "restore:Out:"

repeat with i from 1 to 100000000
 
 
 tell application "Finder"
 
  set Datei to "abc"
  try
   set Datei to first file of folder InOrdner as string
  end try
  if Datei ? "abc" then
   set oldDelims to AppleScript's text item delimiters
   set AppleScript's text item delimiters to ":"
   
   set Dateiname to last text item of Datei
   set DateinameORG to last text item of Datei as string
   if exists file Dateiname in folder OutOrdner then
    repeat with j from 1 to 999
     
     set Dateiname to Dateiname & j as string
     if exists file Dateiname in folder OutOrdner then
     else
      exit repeat
     end if
    end repeat
    set name of file DateinameORG in folder InOrdner to Dateiname as string
   
   else
    copy file Datei to folder OutOrdner
    move file Datei to trash
   end if
   
   set AppleScript's text item delimiters to oldDelims
  end if
 end tell
 
 delay 3
 
end repeat


Problem Nummer 1:
Wie kann ich eine Endlosschleife bauen, damit ich nicht nach 100000000 Durchläufen das Skript neustarten muss ?

Problem Nummer 2:
Wie kann ich sicher gehen, dass die Datei im InOrdner wirklich schon vollständig da ist und nicht noch irgendwie dorthin kopiert wird ?
X

Dateien kopieren, wenn sie im Ordner angekommen sind ...

Hans Haesler
  
Beiträge gesamt: 5826

17. Apr 2005, 16:32
Beitrag # 2 von 16
Beitrag ID: #419529
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stephan,

versuche es mal mit einer Ordneraktion. Unter Mac OS 9 ist es allerdings notwendig, dass der "In"-Ordner
geöffnet ist, damit das Ganze funktioniert. Zum Anfügen des Ordneraktions-Script den Mauszeiger auf
den "In"-Ordner richten, die Controltaste niederhalten, die Maustaste betätigen und im Kontextmenü den
Artikel "Aktion an Ordner anfügen..." wählen. Dann im Dialogfenster das Script auswählen und auf den
Button Öffnen klicken.
---
property OutOrdner : "Documents:Out:"

on adding folder items to thisFolder after receiving itemList
    repeat with aFile in itemList
        set filePath to aFile as string
        if not (filePath ends with ":") then
            tell application "Finder" to set fileName to name of file filePath
            set ctr to 1
            repeat
                try
                    alias (OutOrdner & fileName) as string
                on error
                    exit repeat
                end try
                set fileName to (fileName & ctr) as string
                set ctr to ctr + 1
            end repeat
            if ctr = 1 then
                tell application "Finder" to move file filePath to folder OutOrdner
            else
                tell application "Finder" to set name of file aFile to fileName
                tell application "Finder" to move file aFile to folder OutOrdner
            end if
        end if
    end repeat
end adding folder items to

---
Weil die Dateien auf demselben Volumen liegen, muss man sie nicht kopieren. Der Finder verschiebt sie
und das Löschen der Dateien entfällt.

Gruss, Hans


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

swish
Beiträge gesamt: 75

18. Apr 2005, 09:04
Beitrag # 3 von 16
Beitrag ID: #419530
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

Danke erstmal für Deine Hilfe. Nur leider will das Skript nicht so recht funktionieren. Es tut sich nichts.

Der Ordner ist jedoch geöffnet und selbst wenn ich auf dem Rechner, der die Ordneraktion hostet etwas in den In-Ordner schiebe, bleibt trotzdem jegliche Reaktion aus ....

Das System ist 9.22 - ich brauche keine Scripting Additions hierfür, oder ?


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

Hans Haesler
  
Beiträge gesamt: 5826

18. Apr 2005, 10:09
Beitrag # 4 von 16
Beitrag ID: #419531
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stephan,

zum Ausführen einer Ordneraktion braucht es die Scripting Addition "Standard Additions" und die System-
erweiterung "Ordneraktionen". Aber beide gehören zur Grundausstattung des Systems. Bitte kontrolliere, ob sich
"Standard Additions" im Ordner Scripting Additions befindet und ob die Systemerweiterung aktiviert ist.

Eine weitere Kontrolle: Du hast das Script im normalen, kompilierten Format auf den Rechner gesichert. Dann
hast Du es mithilfe des Kontextmenüs dem "In"-Ordner (nicht dem "Out"-Ordner ;-) zugewiesen. Zum Überprüfen
kannst Du nochmals diesen Ordner auswählen, die Control-Taste niederdrücken, damit das Kontext-Menü erscheint.
Dieses sollte um einen neuen Artikel erweitert worden sein, nämlich "Ordneraktion entfernen". Und als Unterartikel
sollte der Name des Scripts zu sehen sein.

Wenn der "In"-Ordner geöffnet ist und Du Dateien hineinkopierst, werden sie in den "Out"-Ordner verschoben.

Gruss, Hans


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

swish
Beiträge gesamt: 75

18. Apr 2005, 10:43
Beitrag # 5 von 16
Beitrag ID: #419532
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi nochmal,

ich habe alles nochmal und nochmal und nochmal überprüft und es scheint alles richtig zu sein.

Hab das ganze nochmal an einem anderen Rechner probiert und bekomme jetzt folgende Fehlermedlung:

"Die an diesen Ordner angefügte Ordneraktion enthält keine Skriptressourcen."  :?

Kann das damit zusammenhängen, dass die ganze Aktion auf einem Servervolume laufen soll ?

Gruß,
Stephan


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

Hans Haesler
  
Beiträge gesamt: 5826

18. Apr 2005, 11:51
Beitrag # 6 von 16
Beitrag ID: #419533
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stephan,

der überwachte "In"-Ordner kann sich auch auf einem Servervolume befinden. Auch das Script kann dort
untergebracht sein. Und das Ordnerfenster muss nicht unbedingt auf dem Monitor des Macs geöffnet sein,
von welchem aus das Ordneraktionsscript angehängt wurde. 

Der "Out"-Ordner kann sich auch auf einem anderen Volume befinden. Ich nehme an, dass Du im Script
in der ersten Zeile den Pfad des Out-Ordners geändert hast, denn ich habe vergessen mein "Documents"
durch Dein "restore" zu ersetzen ...

Hier nochmals die Voraussetzungen:
– Die Systemerweiterung "Ordneraktionen" muss aktiviert sein.
– Die Scripting Addition "Standard Additions" muss sich im aktiven Ordner "Scripting Additions" befinden.
– Im Kontextmenü muss im Menüartikel "Ordneraktion entfernen" als Unterartikel der Namen des Scripts stehen.

Frage: Ist das Icon des "In"-Ordners mit einem kleinen AppleScript-Symbol ergänzt worden?

Gruss, Hans


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

swish
Beiträge gesamt: 75

18. Apr 2005, 11:56
Beitrag # 7 von 16
Beitrag ID: #419534
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

ich kann es mir nicht erklären. Alle Einstellungen scheinen richtig zu sein !

Ich habe das kleine AppleScript Symbol am Ordner, wenn ich sage "Skript bearbeiten", kommt das richtige Ding hoch. Der Pfad stimmt, die Additions sind installiert ...

Vielleicht sollten wir doch zurück zum Anfangsskript gehen ?! Wie ist das mit der Endlosschleife ? Gibt es sowas ?
Ich habe schon versucht:

repeat with i from 1 to 1000
  blablabla
  set i to 2
end repeat

Aber das ignoriert der völlig.


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

Hans Haesler
  
Beiträge gesamt: 5826

18. Apr 2005, 12:15
Beitrag # 8 von 16
Beitrag ID: #419535
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stephan,

schade, dass die Ordneraktion bei Dir nicht funktionieren will. Auch nicht nach einem Neustart?

Nun gut, wenden wir uns als Deinem Originalscript zu. Es gibt eine Endlosschleife, aber diese darf man
nur einsetzen wenn auch eine Ausstiegsbedingung definiert ist. Sonst dreht das Script ... endlos.

Den Wert der automatischen Zählervariablen 'i' kann man nicht beeinflussen. Man muss eine eigene
Zählervariable definieren: 'set ctr to 1' und sie bei jedem Umgang inkrementieren 'set ctr to ctr + 1'.
Also zum Beispiel:
---
set ctr to 1
repeat
    if ctr = 5 then exit repeat
    display dialog "" & ctr giving up after 1
    set ctr to ctr + 1
end repeat

---
Ich werde versuchen, Dein Script zum Laufen zu bringen, kann mich aber voraussichtlich erst heute
Abend damit befassen.

Gruss, Hans


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

swish
Beiträge gesamt: 75

18. Apr 2005, 13:33
Beitrag # 9 von 16
Beitrag ID: #419536
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
sehr fein!

die schleife funktioniert jetzt super. Eine Abbruchfunktion habe ich auch miteingebaut.

Jetzt habe ich nur ein neues Problem: Wenn größere Dateien in den InOrdner kopiert werden, versucht das Skript (trotz delay) unter umständen auf eine Datei zuzugreifen, die sich noch im Kopierprozess befindet. Kann man eine Funktion einbauen, die checkt, ob die Datei in Gebrauch ist ???


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

Hans Haesler
  
Beiträge gesamt: 5826

18. Apr 2005, 14:16
Beitrag # 10 von 16
Beitrag ID: #419537
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stephan,

ja, das ist fein – aber nicht empfehlenswert, weil andere Prozesse dabei zu kurz kommen.
Wie gesagt, werde ich mich später Deines Scripts annehmen. Und dabei die Repeat-Schleife
durch einen 'on idle'-Handler ersetzen.

Eine Funktion, welche prüft, ob die Datei noch nicht vollständig kopiert ist, werde ich
auch versuchen einzubauen. Wie gross sind denn Deine grösseren Dateien?

Gruss, Hans


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

swish
Beiträge gesamt: 75

18. Apr 2005, 14:22
Beitrag # 11 von 16
Beitrag ID: #419538
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
tja, also so im schlimmsten fall können die mal ein oder zweihundert mb groß sein. also dauert dann irgendwie - je nach anbindung - 10 bis 30 sekunden. das blöde ist, wenn ich jetzt einen "delay" mit reinbastel, dann dauern die kleineren dateien auch wieder ewig.


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

Hans Haesler
  
Beiträge gesamt: 5826

18. Apr 2005, 17:42
Beitrag # 12 von 16
Beitrag ID: #419539
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stephan,

jetzt ist die erste Version des Dateien-Verschiebungs-Scripts bereit. Ich habe es Dir
per E-mail zugestellt, weil es wichtig ist, dass der Code richtig gesichert ist:
Als Applikation und beide Checkboxen aktiviert (Unterdrücken des Startbildes und – vor
allem – dass das Progrämmchen im Hintergrund laufen wird).

Das Script wird wie ein Programm durch Doppelklick auf sein Icon gestartet. Du kannst
auch ein Alias davon im Apfel-Menü unterbringen. Zum Beenden: Wie jedes andere Programm
im Programmumschalter auswählen und Befehl-Q tippen.

Im Script sorgt der 'idle'-Handler dafür, dass der "In"-Ordner nicht unzählige Male pro
Sekunde abgefragt wird, sondern mit einem vernünftigen Intervall, welches mit dem
Return-Wert eingestellt wird.

Wenn der Mac gerade mal nichts zu tun hat, ist sein Zustand 'idle'. Diese Gelegenheit
wartet das Script ab, um im "In"-Ordner nachzuschauen, ob neue Dateien eingetroffen sind.
Per Vorgabe habe ich 'return 1' eingesetzt. Einmal pro Sekunde wird also der Inhalt des
"In"-Ordners geprüft. Weil aber das Kopieren und Verschieben bestimmt länger dauern
wird, sorgt die Variable 'okay' dafür, dass eine weitere Dateiliste erst erstellt wird,
wenn die aktuelle abgearbeitet ist.

Zu Beginn ist der Wert von 'okay' also 'true'. Bevor das Script in die Wiederholungsschleife
geht, um sich um die Dateien zu kümmern, wird 'okay' zu 'false'. Wenn alle Dateien verschoben
sind, wird die Schleife verlasssen, 'okay' wird auf 'true' gesetzt und es beginnt von vorn.

In dieser ersten Version habe ich auf das Prüfen, ob eine Datei komplett im "In"-Ordner
angekommen ist, verzichtet. Ein kurzer Test hat ergeben, dass dies nicht notwendig ist.
Doch vielleicht wirst Du in der Praxis andere Erfahrungen machen.
---
property InOrdner : "restore:In:"
property OutOrdner : "restore:Out:"
global okay
set okay to true

on idle
    checkFolder()
    return 1 -- das Abfrage-Intervall in Sekunden
end idle

on checkFolder()
    if okay = true then
        set okay to false
        tell application "Finder" to set itemList to every item of folder InOrdner
        repeat with i from 1 to count of itemList
            set aliasPath to (item i of itemList) as alias
            set stringPath to aliasPath as string
            if not (stringPath ends with ":") then
                tell application "Finder" to set fileName to name of file stringPath
                set ctr to 1
                repeat
                    try
                        alias (OutOrdner & fileName) as string
                    on error
                        exit repeat
                    end try
                    set fileName to (fileName & ctr) as string
                    set ctr to ctr + 1
                end repeat
                if ctr = 1 then
                    try
                        tell application "Finder" to move file stringPath to folder OutOrdner
                    end try
                else
                    try
                        tell application "Finder" to set name of file stringPath to fileName
                    end try
                    try
                        tell application "Finder" to move file aliasPath to folder OutOrdner
                    end try
                end if
            end if
        end repeat
        set okay to true
    end if
end checkFolder

---
So. Nun hoffe ich, dass wir mit diesem Ansatz mehr Erfolg haben werden, als mit der Ordneraktion.

Gruss, Hans


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

swish
Beiträge gesamt: 75

19. Apr 2005, 07:59
Beitrag # 13 von 16
Beitrag ID: #419540
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Wir haben mehr Erfolg !!!!

Es funktioniert sehr gut - doch leider gibt es ein "aber".

Wenn ich größere Dateien in den In Ordner hineinschiebe, dann erscheint sie während des Kopiervorganges schon für ne viertel Sekunde im OutOrdner und ist danach spurlos verschwunden .....

Wie kann das sein ?

Besten Gruß und Dank,

Stephan


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

Hans Haesler
  
Beiträge gesamt: 5826

19. Apr 2005, 08:43
Beitrag # 14 von 16
Beitrag ID: #419541
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Stephan,

was heisst "spurlos"? Ist die Datei ins Bermuda-Dreieck zwischen Usprungsordner, InOrdner und
OutOrdner gesogen worden? Und wenn Du mit Sherlock danach suchst?

Nun weiss ich nicht mehr weiter ... Ausser – vielleicht – die Dateien zu kopieren (statt sie zu
verschieben), um sie anschliessend zu entfernen. Aber bei grossen Mengen kann dies rasch zu 
Speichermangel führen.

Da muss irgend etwas an Deiner Arbeitsumgebung speziell sein. Ordneraktionen gehen nicht ...
der Finder verliert Dateien ...

Gruss, Hans


als Antwort auf: [#419528]

Dateien kopieren, wenn sie im Ordner angekommen sind ...

swish
Beiträge gesamt: 75

25. Apr 2005, 13:45
Beitrag # 15 von 16
Beitrag ID: #419542
Bewertung:
(5407 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

das Bermuda-Dreieck scheint eine einmalige Sache gewesen zu sein. Jetzt funktioniert alles bestens !!!

Vielen Dank fü Deine schnelle Hilfe!

(Um's mit DropStuff Worten zu sagen : People like you make the world go round.)

Beste Grüße,
Stephan


als Antwort auf: [#419528]
X