Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
hiro •->

Anmeldedatum: 25.12.2001 Beiträge: 15
|
Verfasst am: 29.12.2001 - 16:31 Titel: Berechnung falsch? - ... dabei gings gestern noch ... |
|
|
Hallo zusammen,
es ist ein wirklich fieses Problem - und ich schwöre, gestern lief auch noch alles. Danks Snows Hilfe hab ich ein Skript zusammenbekommen, das Ordnergrößen berechnet - und je nachdem, wie groß der Ordner ist, verschiedene Aktionen veranlaßt. Heute nun geht es plötzlich nicht mehr. Und ich komm einfach nicht drauf, warum.
Hier der fragliche Ausschnitt:
set the total_size to ""
repeat with this_item in size_list
set the total_size to the total_size + this_item
end repeat
--sort and shorten to one decimal place
if the total_size > 1.0E+9 then
set the first_part to (the total_size div 1.0E+9)
set the second_part to (the total_size mod 1.0E+9) div 100000000
set the total_size to (the first_part & "." & the second_part as string) & " GBytes"
else if the total_size > 1000000 then
set the first_part to (the total_size div 1000000)
set the second_part to (the total_size mod 1000000) div 100000
set the total_size to (the first_part & "." & the second_part as string) & " MBytes"
else if the total_size > 1000 then
set the first_part to (the total_size div 1000)
set the second_part to (the total_size mod 1000) div 100
set the total_size to (the first_part & "." & the second_part as string) & " KBytes"
else
set the total_size to the total_size & " Bytes"
log total_size
log class of total_size
end if
--display the answer
display dialog "Backup Ordner # 1 enthält: " & the total_size buttons {"OK"} with icon 1 default button 1
if (item 1 of total_size) < 6500000 then
open folder "backup #01" of folder "Backup" of startup disk
select every item of folder "backup #01" of folder "Backup" of startup disk
move selection to folder ">>>>Backup Ordner<<<<" of folder "Files" of disk "Mac OS X"
move folder "backup #01" of folder "Backup" of startup disk to the trash
end if
--else
if (item 1 of total_size) > 6500000 then
select the folder "backup #01" of folder "Backup" of startup disk
select every item of container window of folder "backup #01" of folder "Backup" of startup disk
make new alias file to selection at folder "backup #01" of folder "Backup" of startup disk
select every alias file of container window of folder "backup #01" of folder "Backup" of startup disk
move selection to folder "Aliasse von heute"
end if
Es soll also - wenn der Ordner "backup #01" kleiner ist, als 650 MB, den Inhalt in den Ordner Backup Ordner" verschieben und den Ordner "backup #01" danach löschen.
Ist der Ordner "backup #01" größer als 650 MB, soll er bleiben, wo er ist und es sollen nur aliasse aller enthaltenen Datein in den Ordner "Aliasse von heute" gelegt werden.
So weit, so gut.
Nur tut er es seit heute früh nicht mehr.
Und Ratlosigkeit macht sich breit, hier auf meinem Schreibtisch ...
Wer kann helfen und mir den entscheidenden gedanklichen Schubs geben?
Hiro |
|
Nach oben |
|
 |
Snow Administrator


Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 29.12.2001 - 17:46 Titel: Berechnung falsch? |
|
|
Schon die erste Zeile birgt den Fehler:
set the total_size to ""
Dadurch legst du zwar die Variable an - allerdings als Textwert.
Mit Text lässt sich aber schwer rechnen.
Also besser wäre da:
set the total_size to 0 _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com |
|
Nach oben |
|
 |
hiro •->

Anmeldedatum: 25.12.2001 Beiträge: 15
|
Verfasst am: 29.12.2001 - 17:56 Titel: Berechnung falsch? |
|
|
Geht trotzdem nicht.
Das Script stellt fest, daß mein Ordner "backup #01" 694 MB groß ist - und fängt an, den Inhallt zu kopieren.
Dabei sollte es bei Ordnern über 650 MB ja nur Aliasse anlegen und sonst nix machen ....
Noch immer ratlos - aber natürlich mit herzlichem Dank
hiro |
|
Nach oben |
|
 |
hiro •->

Anmeldedatum: 25.12.2001 Beiträge: 15
|
Verfasst am: 29.12.2001 - 18:49 Titel: Berechnung falsch? |
|
|
Kleiner Nachtrag:
da viele Nullen ja immer leicht verwirren, hab ich neu gerechnet:
1024 byte = 1 KB
1024000 byte = 1 MB
6,656e+8 byte = 650 MB
Das eingesetzt brachte aber leider auch nicht den gewünschten Erfolg ...
hiro |
|
Nach oben |
|
 |
Snow Administrator


Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 29.12.2001 - 18:57 Titel: Berechnung falsch? |
|
|
Stimmt. Das war noch nicht der Fehler.
Jedenfalls nicht direkt. Aber es liegt trotzdem an der Variablen "total_size". Sie ändert im Laufe des Skripts viel zu oft die Klasse. Das kann man kaum noch nachvollziehen. Ich habe zur Veranschaulichung noch ein paar log-Befehle eingesetzt:
set the total_size to ""
repeat with this_item in size_list
set the total_size to the total_size + this_item
log "--- total_size bei Repeat-Loop ---"
log total_size
log class of total_size
end repeat
--sort and shorten to one decimal place
if the total_size > 1.0E+9 then
set the first_part to (the (item 1 of total_size) div 1.0E+9)
set the second_part to (the (item 1 of total_size) mod 1.0E+9) div 100000000
set the total_size to (the first_part & "." & the second_part as string) & " GBytes"
else if the total_size > 1000000 then
set the first_part to (the total_size div 1000000)
set the second_part to (the total_size mod 1000000) div 100000
set the total_size to (the first_part & "." & the second_part as string) & " MBytes"
else if the total_size > 1000 then
set the first_part to (the total_size div 1000)
set the second_part to (the total_size mod 1000) div 100
set the total_size to (the first_part & "." & the second_part as string) & " KBytes"
log "--- total_size bei if total_size > 1000 ---"
log total_size
log class of total_size
else
set the total_size to the total_size & " Bytes"
log "--- total_size bei else ---"
log total_size
log class of total_size
end if
Im Eventprotokoll zeigt sich jetzt folgendes:
get size of selection
--> { 1.11244E+5 }
(*--- size_list ---*)
(*1.11244E+5*)
(*list*)
(*--- total_size bei Repeat-Loop ---*)
(*111244*)
(*integer*)
(*--- total_size bei if total_size > 1000 ---*)
(*111.2 KBytes*)
(*string*)
Es ist praktisch immer noch das gleiche Problem wie gestern. "total_size" hat einfach die falsche Klasse. Am Ende der Zahlenformatierung wird ein "string" daraus. Für die nachfolgenden Vergleichsbedingungen ist das wieder nicht brauchbar.
Diesen Wert brauchst du zwar zur Anzeige im Dialog - aber dazu könntest du ja eine weitere Variable benutzen.
Ändere das Skript mal so ab:
set the display_the_size to (the first_part & "." & the second_part as string) & " KBytes"
Jetzt hast du den entsprechenden Wert für die Dialog-Anzeige in der Variablen "display_the_size". "total_size" behält weiterhin seine Klasse "integer". Das ist immens wichtig.
Wie du jetzt gesehen hast, war die Klasse von "total_size" bei den ersten drei Möglichkeiten der Überprüfung "string". Beim 'else' wird eine Liste daraus - das hatten wir ja gestern schon. Du hättest also - abhängig von der Ordnergröße - verschiedene Klassen für die Variable "total_size".
Mit obiger kleinen Änderung besteht das Problem nicht mehr.
Nachfolgend brauchst du natürlich auch nicht mehr "item 1 of total_size" zu benutzen. Es genügt jetzt wieder "total_size". _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com
Zuletzt bearbeitet von Snow am 24.02.2003 - 23:16, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Snow Administrator


Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 29.12.2001 - 19:04 Titel: Berechnung falsch? |
|
|
Noch ein Nachtrag:
Es ist generell nicht gut, mit Finder-Selektionen zu arbeiten. Ein Skript soll schließlich die Arbeit automatisch erledigen und das möglichst auch im Hintergrund. Wenn man nun nebenher weiterarbeiten will, kann es doch viel zu leicht passieren, dass man im falschen Augenblick was selektiert, mit dem das Skript nichts anfangen kann - oder man hebt die durch das Skript erfogte Selektion auf.
Besser ist es die entsprechenden Objekte mit deren Pfad anzusprechen.
Beispiel:
tell application "Finder"
set derOrdner to the name of the startup disk & ":BackUp:backup #01:"
set total_size to the size of folder derOrdner
end tell _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com
Zuletzt bearbeitet von Snow am 24.02.2003 - 23:17, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
hiro •->

Anmeldedatum: 25.12.2001 Beiträge: 15
|
Verfasst am: 29.12.2001 - 19:34 Titel: Berechnung falsch? |
|
|
Hi Snow, kurzer Zwischenbericht:
so richtig klar ist mir das alles noch nicht, aber danke nochmals für die Mühe! Ich geh Deine Hinweise jetzt nochmal haarklein durch. Vielleicht wirds ja dann klarer.
hiro |
|
Nach oben |
|
 |
hiro •->

Anmeldedatum: 25.12.2001 Beiträge: 15
|
Verfasst am: 29.12.2001 - 19:45 Titel: Berechnung falsch? |
|
|
Jetzt vollends verwirrt:
Snow, kannst Du mir sagen, wo ich
set the display_the_size to (the first_part & "." & the second_part as string) & " KBytes"
einarbeiten soll?
Das krieg ich irgendwie nicht mehr so richtig auf die Reihe (war halt ne lange Nacht vor dem Mac ...) Anscheinend seh ich den Wald im Augenblick vor Bäumen nicht ...
hiro |
|
Nach oben |
|
 |
Snow Administrator


Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 29.12.2001 - 19:49 Titel: Berechnung falsch? |
|
|
AppleScript führt, wenn möglich, eine automatische Datentyp-Umwandlung (coercion) aus. Das kann eben leicht zum Problem werden wenn man nicht genau aufpasst.
Kleines Beispiel:
set dieVariable to ""
log class of dieVariable -- string
set dieVariable to dieVariable + 1
log class of dieVariable -- integer
set dieVariable to dieVariable & "1"
log class of dieVariable -- list
set dieVariable to dieVariable + 1
log class of dieVariable -- Fehler: Can't make {1, "1" } into a number
Sieht doch eigentlich harmlos aus, ist aber recht verhängnisvoll. Man sollte also bei der Skriptentwicklung immer die Klassen von Variablen gut im Auge behalten. _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com |
|
Nach oben |
|
 |
hiro •->

Anmeldedatum: 25.12.2001 Beiträge: 15
|
Verfasst am: 29.12.2001 - 19:59 Titel: Berechnung falsch? |
|
|
Stimmt genau.
Es gibt böse Fallen. Und ich bin mit beiden Beinen in eine reingesprungen.
Nur hilft mir diese Feststellung (wiewohl sie 100%ig richtig ist) in ihrer Abstraktheit im Augenblick nicht wirklich weiter.
Am besten, ich gebs auf - sagen wir, für die nächsten 10 Jahre ...
hiro |
|
Nach oben |
|
 |
Snow Administrator


Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 29.12.2001 - 20:27 Titel: Berechnung falsch? |
|
|
OK, jetzt mal wieder langsamer. Ich habe die Zeilen mit 'display_the_size' jetzt mal eingefügt.
Die log-Befehle habe ich jetzt wieder heraus genommen, damit es nicht ganz so unübersichtlich wird. Ich denke, du hast die Nützlichkeit dieses Befehls erkannt. Also setze ihn an solchen Stellen im Skript ein, die dich gerade interessieren, worüber das Eventprotokoll aber im Normalfall schweigt.
Hier jetzt dein Skript:
tell application "Finder"
if (exists the folder "backup #01" of folder "Backup" of startup disk) then
select the folder "backup #01" of folder "Backup" of startup disk
end if
--get a list of the size of each selected item
try
set size_list to (size of selection) as list
log "--- size_list ---"
log size_list
log class of size_list
on error
beep
display dialog "Nichts ausgewählt." buttons { "Abbrechen" } default button 1
end try
set the total_size to ""
repeat with this_item in size_list
set the total_size to the total_size + this_item
end repeat
--sort and shorten to one decimal place
if the total_size > 1.0E+9 then
set the first_part to (the (item 1 of total_size) div 1.0E+9)
set the second_part to (the (item 1 of total_size) mod 1.0E+9) div 100000000
set the display_the_size to (the first_part & "." & the second_part as string) & " KBytes"
else if the total_size > 1000000 then
set the first_part to (the total_size div 1000000)
set the second_part to (the total_size mod 1000000) div 100000
set the display_the_size to (the first_part & "." & the second_part as string) & " KBytes"
else if the total_size > 1000 then
set the first_part to (the total_size div 1000)
set the second_part to (the total_size mod 1000) div 100
set the display_the_size to (the first_part & "." & the second_part as string) & " KBytes"
else
set the display_the_size to the total_size & " Bytes"
end if
--display the answer
display dialog "Backup Ordner # 1 enthält: " & the display_the_size buttons { "OK" } with icon 1 default button 1
if total_size < 6500000 then
open folder "backup #01" of folder "Backup" of startup disk
select every item of folder "backup #01" of folder "Backup" of startup disk
move selection to folder ">>>>Backup Ordner<<<<" of folder "Files" of disk "Mac OS X"
move folder "backup #01" of folder "Backup" of startup disk to the trash
end if
--else
if total_size > 6500000 then
select the folder "backup #01" of folder "Backup" of startup disk
select every item of container window of folder "backup #01" of folder "Backup" of startup disk
make new alias file to selection at folder "backup #01" of folder "Backup" of startup disk
select every alias file of container window of folder "backup #01" of folder "Backup" of startup disk
move selection to folder "Aliasse von heute"
end if
end tell
Ich denke, jetzt kannst du mal weitertesten. _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com
Zuletzt bearbeitet von Snow am 24.02.2003 - 23:18, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
hiro •->

Anmeldedatum: 25.12.2001 Beiträge: 15
|
Verfasst am: 29.12.2001 - 20:33 Titel: Berechnung falsch? |
|
|
Perfekte Vorlage .... werd ich natürlich machen.
hiro |
|
Nach oben |
|
 |
hiro •->

Anmeldedatum: 25.12.2001 Beiträge: 15
|
Verfasst am: 29.12.2001 - 20:57 Titel: Berechnung falsch? |
|
|
Ja Snow,
ich glaube, so langsam komme ich dahinter, was Du mir sagen wolltest. Denn ich beginne die Fallstricke zu sehen, in die ich mich mit meinen Varibalen Klassen kunstvoll eingewickelt habe. Mal sehen, ob ich zukünftig aus eigener Kraft da herumkomme. Aber erstmal: Dank, megabyteweise Dank.
hiro |
|
Nach oben |
|
 |
Snow Administrator


Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 29.12.2001 - 21:35 Titel: Berechnung falsch? |
|
|
Du hast jetzt mit der häufigsten Fehlerquelle Bekanntschaft gemacht.
Oft ist die automatische Datentyp-Umwandlung ja ganz praktisch:
set x to 1234 -- Klasse: integer
display dialog x -- x wird automatisch zu einem Textwert
Andererseits muss man sich der Vorgehensweise von AppleScript eben bewusst sein. Wenn möglich führt AppleScript diese Umwandlung durch. Es führt halt all zu oft zu einem unerwünschten Ergebnis.
set x to 1234 + 321 -- Klasse: integer
display dialog x -- x wird automatisch zu einem Textwert
Jetzt ändere ich nur mal das Plus-Zeichen in ein Kaufmanns-Und:
set x to 1234 & 321 -- Klasse: list
display dialog x -- Fehler: Can't make { 1234, 321 } into a string
Man sieht schon bei der Fehlermeldung, dass x eine Liste ist.
Das ist einfach etwas, was man immer im Hinterkopf behalten sollte. Dann wird man auch beim Debugging schnell weiterkommen. _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com |
|
Nach oben |
|
 |
|