Fischer-Bayern.de
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Berechnung falsch? - ... dabei gings gestern noch ...

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Fischer-Bayern.de Foren-Übersicht -> AppleScript-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
hiro
•->
•->


Anmeldedatum: 25.12.2001
Beiträge: 15

BeitragVerfasst am: 29.12.2001 - 16:31    Titel: Berechnung falsch? - ... dabei gings gestern noch ... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 29.12.2001 - 17:46    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
hiro
•->
•->


Anmeldedatum: 25.12.2001
Beiträge: 15

BeitragVerfasst am: 29.12.2001 - 17:56    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
hiro
•->
•->


Anmeldedatum: 25.12.2001
Beiträge: 15

BeitragVerfasst am: 29.12.2001 - 18:49    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 29.12.2001 - 18:57    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 29.12.2001 - 19:04    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
hiro
•->
•->


Anmeldedatum: 25.12.2001
Beiträge: 15

BeitragVerfasst am: 29.12.2001 - 19:34    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
hiro
•->
•->


Anmeldedatum: 25.12.2001
Beiträge: 15

BeitragVerfasst am: 29.12.2001 - 19:45    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 29.12.2001 - 19:49    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
hiro
•->
•->


Anmeldedatum: 25.12.2001
Beiträge: 15

BeitragVerfasst am: 29.12.2001 - 19:59    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 29.12.2001 - 20:27    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
hiro
•->
•->


Anmeldedatum: 25.12.2001
Beiträge: 15

BeitragVerfasst am: 29.12.2001 - 20:33    Titel: Berechnung falsch? Antworten mit Zitat

Perfekte Vorlage .... werd ich natürlich machen.

hiro
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
hiro
•->
•->


Anmeldedatum: 25.12.2001
Beiträge: 15

BeitragVerfasst am: 29.12.2001 - 20:57    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 29.12.2001 - 21:35    Titel: Berechnung falsch? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Fischer-Bayern.de Foren-Übersicht -> AppleScript-Forum Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2002 phpBB Group
Deutsche Übersetzung von phpBB.de


AppleScript für absolute Starter