Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Kompressionsrate berechnen

Frage Entwicklung Batch & Shell

Mitglied: anve

anve (Level 1) - Jetzt verbinden

26.11.2008, aktualisiert 18.10.2012, 7456 Aufrufe, 16 Kommentare

Zwei Dateien sollten anhand ihrer Dateigröße so verglichen werden, dass damit die Kompressionsrate ausgerechnet werden kann. Die Kompressionsrate gibt das Verhältnis von komprimierter und ursprünglicher Datei an.

Hallo zusammen!

Wie kann ich die Kompressionsrate ausrechnen? Ich weiß wie ich die Dateigröße herausbekomme und ausgeben kann. Wie mache ich das jetzt aber alles in einer Ausgabezeile? Eine FOR- in einer FOR-Schleife (geschachtelt) macht ja nicht das richtige, da alle Dateien dann ausgegeben werden. Zwei "Parameter" in einer FOR-Schleife gehen auch nicht, oder?

Hier mal mein Code:

01.
@echo off 
02.
 
03.
REM Kompressionsrate berechnen 
04.
 
05.
echo //////////////////////////////// 
06.
set "tab=        " 
07.
set origpath=C:\temp\test\*.bmp 
08.
set comppath=C:\temp\test\*.zip 
09.
echo Ursprungsdateien: %origpath% 
10.
echo Komprimierte Datein: %comppath% 
11.
echo. 
12.
echo Datei %tab% Urspr. Groesse %tab% Kompr. Groesse %tab% k-Faktor 
13.
for /f "delims=" %%i in ('dir /b /s "%origpath%"') do ( 
14.
	Echo %%~nixi %tab% %%~zi 
15.
	 
16.
17.
echo ////////////////////////////////
Also es soll folgendes können:
-Kompressionsrate pro Datei
-durchschnittliche Kompressionsrate am Ende

Zu "Kompressionsrate pro Datei":
Wie setze ich zwei Dateien ins Verhältnis? Also bball.bmp & bball.zip?

Zu "durchschnittliche Kompressionsrate am Ende":
Theoretisch müsste ich zwei Variablen mitführen. Eine als Summe und die andere als Anzahl. Am Ende mache ich dann eine Division und gebe das Ergebnis aus.

[EDIT]
Hier mein erster Ansatz mit oben genannten Problem, dass ich keine zwei IN darin haben darf bzw. %%i und %%j:
01.
@echo off 
02.
 
03.
set path=C:\temp\ 
04.
set origpath=C:\temp\test\*.bmp 
05.
set comppath=C:\temp\test\*.zip 
06.
 
07.
if EXIST "%path%orig.txt" del "%path%orig.txt" 
08.
if EXIST "%path%comp.txt" del "%path%comp.txt" 
09.
for /f "delims=" %%i in ('dir /b /s "%origpath%"') do ( 
10.
	Echo %%~zi>>orig.txt	 
11.
12.
for /f "delims=" %%i in ('dir /b /s "%comppath%"') do ( 
13.
	Echo %%~zi>>comp.txt	 
14.
15.
 
16.
set sum=0 
17.
set anz=0 
18.
for /f "delims=" %%i %%j in ("%path%orig.txt") in ("%path%comp.txt") do ( 
19.
	set orig=%%~zi; 
20.
	set comp=%%~zj; 
21.
	set /a erg=comp/orig 
22.
	echo K-Faktor %erg% % 
23.
	set /a sum=sum+erg 
24.
	set /a anz+=1 
25.
26.
set /a avg=sum/anz 
27.
echo Durchschnitt: %avg%
[/EDIT]

Ich würde mich auf eine Hilftestellung freuen!

LG
anve
Mitglied: Ren
26.11.2008 um 18:51 Uhr
Skizze:
01.
@echo off 
02.
 
03.
REM Kompressionsrate berechnen 
04.
 
05.
echo //////////////////////////////// 
06.
set "tab=        " 
07.
set origpath=C:\temp\test\*.bmp  
08.
set comppath=C:\temp\test\*.zip 
09.
set "compPathFile=C:\temp\test" 
10.
echo Ursprungsdateien: %origpath% 
11.
echo Komprimierte Datein: %comppath% 
12.
echo. 
13.
echo Datei %tab% Urspr. Groesse %tab% Kompr. Groesse %tab% k-Faktor 
14.
for /f "delims=" %%i in ('dir /b /s "%origpath%"') do ( 
15.
    for /f "delims=" %%j in ('dir /b /s "%comppath%\%%~ni.zip"') do ( 
16.
	set "file=%%~ni%%~xi" 
17.
	set /a orgsize=%%~zi 
18.
	set /a comsize=%%~zj 
19.
	set /a kfac=%%~zi*100/%%~zj 
20.
21.
	call :ausgabe 
22.
23.
echo //////////////////////////////// 
24.
goto :eof 
25.
:ausgabe 
26.
Echo %file% %tab% %orgsize% %tab% %comsize% %tab% 100: %kfac% 
27.
goto :eof
Den Faktor 100 habe ich eingebaut, weil man meines Wissens mit Batch nichts so leicht mit Kommas rechnen kann. Wenn du also 1:kfac haben willst, dann musst du die Zahlen noch durch 100 teilen. Das sollte aber kein Problem sein.
Bitte warten ..
Mitglied: miniversum
26.11.2008 um 18:52 Uhr
Ich gehe mal davon aus das es für jede orginal bmp Datei eine zip Datei im gleichen Verzeichnis mit dem gleichen Namen gibt (ungetestet):
01.
@echo off 
02.
REM Kompressionsrate berechnen 
03.
 
04.
echo //////////////////////////////// 
05.
set "tab=        " 
06.
set origpath=C:\temp\test\*.bmp 
07.
set comppath=C:\temp\test\*.zip 
08.
echo Ursprungsdateien: %origpath% 
09.
echo Komprimierte Datein: %comppath% 
10.
echo. 
11.
echo Datei %tab% Urspr. Groesse %tab% Kompr. Groesse %tab% k-Faktor 
12.
set anzahl=0 
13.
set rate=0 
14.
set rateall=0 
15.
for /f "delims=" %%i in ('dir /b /s "%origpath%"') do ( 
16.
for /f "tokens=3 delims= " %%a in ('dir /-c "%%~ni.bmp"^|find "%%~ni.bmp"') do set orgsize=%%a 
17.
for /f "tokens=3 delims= " %%a in ('dir /-c "%%~ni.zip"^|find "%%~ni.zip"') do set kompsize=%%a 
18.
call verarbeite "%%~ni" %orgsize% %kompsize% 
19.
20.
set /a rate=%rateall%/%anzahl% 
21.
echo durchschnittliche Kompressionsrate: %rate% 
22.
echo //////////////////////////////// 
23.
goto:eof 
24.
 
25.
:verarbeite 
26.
set /a anzahl=%anzahl%+1 
27.
set /a rate=%orgsizeall%/%kompsizeall% 
28.
set /a rateall=%rateall%+%rate% 
29.
echo %1: %tab% %2 %rate% 
30.
 
Du könntest allerdings Probleme mit nachkommastellen bekommen.
Bitte warten ..
Mitglied: anve
26.11.2008 um 19:31 Uhr
Hallo Ren!

Vielen Dank für deine Hilfe!

Was ich nicht verstehe ist wie die geschachtelte FOR-Schleife funktioniert. Müsste die nicht die Operation mehrfach durchführen (je nachdem wieviele Files vorhanden sind)?

Zeile 15 habe ich angepasst:
01.
for /f "delims=" %%j in ('dir /b /s "%compPathFile%\%%~ni.zip"') do (
Wenn ich das Ergebnis durch 100 teile, wird ja der Nachkommabereich abgeschnitten. Gibt es da ein Workaround? Von meinem letzten Thread hab ich das hier erhalten:

01.
set /a s=Dauer / 100 
02.
set /a c=100 + Dauer %% 100 
03.
echo Gesamtdauer in Sekunden: %s%,%c:~-2%
Dabei verstehe ich die zweite Zeile nicht so ganz. Da wird Hundert dazu gezählt. Was macht %% 100?
Zum Schluss wird der Vorkommateil, der Beistrich und der Nachkommateil ausgegeben. Das müsste auch so ähnlich funktionieren...

LG
anve
Bitte warten ..
Mitglied: anve
26.11.2008 um 19:32 Uhr
Hi miniversum!

Toll, wie immer gleich zwei Auswahlmöglichkeiten hier!

Leider findet er bei mir das find nicht:
>Der Befehl "find" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

[EDIT]
Ich arbeite hier auf einem Rechner mit eingeschränkten Rechten. Oder kann es sein, dass eine Registrierung durchgeführt werden muss? Ala
01.
regsvr32 zipfldr.dll
[/EDIT]

Wie könnten die for-Schleifen aussehen, wenn zwei unterschiedliche Verzeichnisse verwendet würden (gleiche Namen gewährleistet, nur unterschiedliche Dateiendungen)? Aber da es ja schon eine Lösung gibt, musst du diese Frage nicht unbedingt beantworten ... Mit den Nachkommastellen hast du allerdings Recht.

BTW:
Von meinem vorigen Thread funktioniert alles wunderbar, nur ich bekomme ständig folgende Fehlermeldung:
>Das System kann das angegebene Laufwerk nicht finden.

Gibts etwas was ich dagegen tun kann? Ich hab Ausgaben die ich machen will und die obige wieder nicht.

Hast du eine Ahnung was falsch sein könnte?

LG
anve
Bitte warten ..
Mitglied: Ren
26.11.2008 um 19:44 Uhr
Die zwei For-Schleifen sind eigentlich gar keine. Er sucht sich die zip-Datei, mit dem gleichen Namen, wie die Ursprungsdatei. Davon gibt es nur eine. Das nutze ich nur, damit ich von der Zip-Datei auch die Größe bekomme. Das geht vielleicht auch eleganter, kA.
Die zweite Zeile scheint für mich der Modulo-Operator zu sein. Damit bekommst du den Rest der Division von Dauer durch 100. So ergibt es aber für mich gerade keinen Sinn:
01.
set /a vorkomma=%size%/100 
02.
set /a nachkomma=%size% %% 100 
03.
echo Größe: %vorkomma%,%nachkomma%
Bitte warten ..
Mitglied: anve
26.11.2008 um 20:05 Uhr
Ach, jetzt seh ich es. Für jedes ZIP-File machst du das. Das ~ni hab ich nicht bedacht.

Modulo macht Sinn. Ich hab es eingebaut und es funktioniert soweit. Ich verstehe es so:
-Division durch 100 ergibt den Vorkommaanteil
-Modulo Operation ergibt den Rest also den Nachkommaanteil.

Die Frage ist wie man die Genauigkeit erhöhen kann. Also z.B. Promille-Bereich
Bitte warten ..
Mitglied: Ren
26.11.2008 um 20:29 Uhr
Mit dem Modulo musst du aufpassen: Modulo ist der Rest: Beispiel: 9 mod 4 = 1. 9 / 4 ist aber nicht 2,1, sondern 2,25. Im Prinzip ist es sowas: 9 / 4 = 2 + 1 / 4, wobei die 1 der Modulo-Wert ist. Die Genauigkeit kannst du nicht großartig beeinflussen, das liegt am begrenzten Wertebereich.
Bitte warten ..
Mitglied: anve
26.11.2008, aktualisiert 18.10.2012
Stimmt! Hmm, gibt es keinen Datentyp der die Nachkommastellen behält? Wahrscheinlich kann man nur den Weg mit der Überführung in eine große Zahl nehmen.

Hier ist nochmal der Weg mit dem Modulo erklärt: http://www.administrator.de/forum/zeit-messen-f%c3%bcr-das-erstellen-ei ...

Zitat von bastla:
Um den Nachkommaanteil in der letzten Zeile zweistellig
ausgeben zu können, wird dieser wiederum durch Hinzufügen
von 100 in den dreistelligen Bereich gebracht und durch Bildung des
Teilstrings "letzte 2 Zeichen" bei Bedarf mit führender
Null erzeugt.

Aber das wird auch nicht weiter helfen ...

Gibt es eigentlich eine Lösung für die Anpassung der Tabs?
Bitte warten ..
Mitglied: Ren
26.11.2008, aktualisiert 18.10.2012
Natürlich gibt es einen Möglichkeit, aber das wird aufwändig: Hier kannst du mal gucken, wie man die Länge einer Variable bekommst:
http://www.administrator.de/forum/suche-sowas-wie-get.length-um-eine-be ...
wenn du die hast, dann kannst du die Tabs durch eine errechnete Anzahl an Leertasten ersetzten. Das geht, aber für mich würde es den Aufwand und die Performance nicht aufwiegen, dann habe ich es lieber hässlich.
Bitte warten ..
Mitglied: anve
26.11.2008 um 23:37 Uhr
Hallo Ren!

Ja, das ist zu aufwändig! Das kann man machen wenn man zuviel Zeit hat ;)
Vielen Dank für deine Mithilfe!

Hast du eine Ahnung was folgende Fehlermeldung bedeutet:
>Das System kann das angegebene Laufwerk nicht finden.

LG
anve
Bitte warten ..
Mitglied: bastla
27.11.2008 um 00:07 Uhr
Hallo anve und Ren!

Eine zwar nicht optimale, aber vielleicht doch akzeptable Lösung für die übersichtliche(re) Ausgabe könnte darin bestehen, manuell eine ausreichende Anzahl von Leerzeichen anzufügen und dann die gewünschten Teile mit einer fixen Spaltenbreite "abzuschneiden" - für den Dateinamen etwa:
set "file=%%~nxi                              "
Bei der Ausgabe dann einfach
echo %file:~,30%
Analog für die Größenangaben (da ohnehin nicht mit den Variablen gerechnet wird, können diese ohne "/a", aber mit einigen Leerzeichen festgelegt werden):
set "orgsize=         %%~zi"
Ausgabe mit 9 Stellen (rechtsbündig):
echo %orgsize:~-9%
Grüße
bastla
Bitte warten ..
Mitglied: Ren
27.11.2008 um 14:36 Uhr
wer oder was schmeißt denn diese Fehlermeldung?
Bitte warten ..
Mitglied: anve
27.11.2008 um 18:26 Uhr
Ich logge die Ausgabe ja mit. Die Fehlermeldung wird dabei in der Eingabeaufforderung ausgegeben. Ich bin draufgekommen, dass es nicht egal ist, wann ich Kommentare setze. Bsp.:

01.
:: tu dies 
02.
command 
03.
:: tu das
Bei manchen Konstellationen kommt diese Fehlermeldung. Wie setze ich Kommentare richtig? Was ich bis jetzt weiß geht das mit REM und ::
Bitte warten ..
Mitglied: anve
27.11.2008 um 18:28 Uhr
Hi bastla!

Vielen Dank für den Tip! Diese Lösung sieht einfach aus. Dennoch werde ich jetzt die Ausgaben in eine csv-Datei speichern da ich dann keine Probleme mit dem Rechnen und insbesondere den Nachkommastellen mehr habe (mache die Rechnungen dann manuell). Das ist für mich im Moment die beste Lösung. Dann ran an die Arbeit ;)

LG
anve
Bitte warten ..
Mitglied: Ren
27.11.2008 um 22:19 Uhr
Hm, sollte eigentlich egal sein. Offiziell sind Kommentare in Batch Zeilen hinter einem REM. Mit :: nutzt man aus, dass :: Text einen fehlerhafte Sprungzieladresse ist. Das wirkt dann sozusagen als Kommentar. Der einzige mir bekannte Unterschied ist, dass man, wenn man echo on schaltet, die Rem-Zeilen ausgegeben bekommt, während die :: nicht angesprungen werden, also auch nicht erscheinen.
Dass er find bei dir nicht findet, finde ich auch suspekt. Find ist ein externe Befehl, die Datei sollte in %windir%\system32\find.exe zu finden sein, und das sollte im Pfad sein. Wenn nicht, ist in meinen Augen etwas nicht in Ordnung, es sei denn, unter Windows Vista oder seven oder weiß der Geier hat man find.exe weggelassen.
Bitte warten ..
Mitglied: anve
30.11.2008 um 16:33 Uhr
Ich werde ganz einfach den Fehler sein lassen so wie er ist. Er wird ja nur angezeigt und funktionieren tut das Skript trotzdem. Es hängt irgendwie mit der Auskommentierung und meinen verwendeten Codezeilen zusammen.

Find wurde auf einem anderen Rechner jetzt gefunden. Dort habe ich Admin-Rechte und da geht es. Beim vorherigen Rechner hatte ich keine Admin-Rechte, aber ich werde mal die find.exe dort suchen. Wie schon gesagt, ich vermute:

a) find.exe nicht vorhanden (was ich mir nicht so ganz vorstellen kann)
b) Registrierung

Z.B. hat dort der Windows-Interne Befehl ZIP auch nicht funktioniert. Und diese Zip-Funktionalität kann man aktivieren und deaktivieren. In meinem Fall hat das auch nichts geholfen. Jedenfalls kann ich nicht über die Konfiguration des Rechners bestimmen. Komischerweise ist der zip-Befehl auf einem anderen Rechner (auch mit eingeschränkten Admin-Rechten) gegangen. Ich werde einfach den Rechner wechseln ...

Vielen, vielen Dank an euch beiden! Ihr habt mir sehr geholfen! Echt großartige Unterstützung von euch!

LG
anve
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Netzwerke
HTTP Overhead Berechnen und Protokolstack

Frage von karlosss zum Thema Netzwerke ...

Festplatten, SSD, Raid
Speicher der nächsten Jahre berechnen (10)

Frage von Ravers zum Thema Festplatten, SSD, Raid ...

Microsoft Office
gelöst Excel: Mittelwert alle 96 Zeilen berechnen (6)

Frage von sims zum Thema Microsoft Office ...

Microsoft Office
gelöst Microsoft Excel: Zwischenwerte berechnen (2)

Frage von christianlindloff zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...