Dieser Beitrag ist schon älter. Bitte vergewissern Sie sich, dass die Rahmenbedingungen oder der enthaltene Lösungsvorschlag noch dem aktuellen Stand der Technik entspricht.

Zeit messen für das Erstellen einer RAR-Datei

Mitglied: anve

Ich will die Zeit messen wie lange das zippen bzw. raren einer Datei bzw. aller Dateien eines Ordners dauert.

Hallo zusammen!

Ich habe folgenden ähnlichen Beitrage gefunden:
http://www.root-faq.de/Zeit_messen_zum_Erstellen_von_Dateien_mit_batch_ ...

Das ganze will ich aber nun verwenden um die Zeitdauer für das Zippen bzw. Raren einer Datei zu messen. Dazu habe ich mich mal mit der Thematik Batch-Dateien beschäftigt. Folgende Probleme habe ich dabei:

1) Wie kann ich die Zeit in eine Variable speichern?
2) Wie kriege ich alle Dateien eins Ordners in eine Variable (array)?
3) Wie berechne ich die benötigte Zeit aus?

[EDIT]: https://www.administrator.de/Laufzeit_bzw._Dauer_einer_Batch_ermitteln!. ... kann schon mal die Zeit messen (wie genau?). Fehlt dann nur noch 2)
Ansonsten gehts hier weiter:[/EDIT]
Zu 1):
Folgende Bsp. habe ich probiert um der Lösung näher zu kommen:

Zu "ECHO Beginn %date% - %time%":
Wie kann ich in einem Echo mehrere Ausgaben machen? In anderen Programmiersprachen macht man das meisten mit +
In diesem Fall wird %date% nicht ausgegeben. Das Konkattenieren funktioniert so weit, aber wenn ich "ECHO %%j.te Schleife: %time%" ausgebe, kommt immer dieselbe Zeit!?

Warum kann ich keine Zeit in eine Variable speichern?
SET /A %begin=%time%
Obiges funktioniert nicht, da ich die Meldung "ECHO ist ausgeschaltet (OFF)." bekomme bei "echo %begin%". In http://www.admini.de/batch-infos.htm steht, dass die Variable dann leer ist. So jetzt habe ich mir eine andere Lösung dafür gesucht (aus https://www.administrator.de/forum/batchdatei-ziel-ordner-aktueller-mona ..):
Damit kriege ich das Datum in einer Variable, aber ich verstehe nicht wie das funktionieren soll. Nirgends ist c, b oder a definiert? Tokens bedeutet anscheinend die Schleifennr. (so hab ich es zumindest verstanden). Delims ist irgendwie der Platzhalter nach dem getrennt wird. Aber was ist wenn ich mehr brauche als diese drei Buchstaben (c, b, a)? Andere Buchstaben funktionieren anscheinend nicht. Ich hab das ganze natürlich auf time umgeschrieben. Aber ich will eigentlich %time% haben, da dies viel genauer ist. Dies wiederum geht nicht in den Klammern ('xxxx'). Gibt es nicht eine einfachere Methode?

Ich will Stunde, Minute, Sekunde, Hundertstel um die Genauigkeit zu erhöhen. Dabei frage ich mich wo die Genauigkeitsgrenze liegt. Wenn ich zweimal %time% ausführe, dann ist ja schon ein Unterschied im Hundertstel-Bereich normalerweise (hier nicht!?). Außerdem denke ich mir, dass Batch-Datein den geringsten Overhead haben als ein externes Programm. Was meint ihr dazu? Lediglich die aufrufe von WinRar & Co. bringen eine Verzögerung mit sich.

Zu 2):
Mit
bekomme ich die gewollte Liste. Wie kriege ich jetzt das in eine Variable? Welche Variablen werden im Batch-Modus überhaupt angeboten? Was ich so gesehen habe, gibt es keine Arrays! Nur Pseudo-Arrays bzw. Abhilfen wie das hier:
von https://www.administrator.info/index.php?content=55c321ed2030066f7d3f65d ...

Oder das hier:
von http://www.msfn.org/board/lofiversion/index.php/t47265.html

Aber ich verstehe nicht wie das funktioniert... Was bedeutet tokens=1,2,* oder tokens=1-3 ? usw.

Zu 3):
Am einfachsten wäre es, wenn ich es so machen könnte:

Aber das geht so ja nicht. In http://www.root-faq.de/Zeit_messen_zum_Erstellen_von_Dateien_mit_batch_ ... wird es folgendermaßen gemacht:


Ich hoffe Ihr könnt mir weiterhelfen.

LG
anve

PS: Hilfreiche Seiten:
http://www.admini.de/batch-infos.htm
http://de.wikibooks.org/wiki/Batch-Programmierung/_Druckversion#Allgeme ...
http://www.computerhope.com/batch.htm

Content-Key: 101669

Url: https://administrator.de/contentid/101669

Ausgedruckt am: 30.07.2021 um 22:07 Uhr

Mitglied: bastla
bastla 12.11.2008 um 21:35:21 Uhr
Goto Top
Hallo anve!

Vorweg: Die Hilfe zu den einzelnen Befehlen kannst Du (am Beispiel "for") so aufrufen:
Zu
1) Wie kann ich die Zeit in eine Variable speichern?
So, wie auch jeden anderen String (die CMD-Shell kann nur mit ganzzahligen Werten rechnen, sodass die Zeitangabe ohnehin nicht unmittelbar zu verarbeiten ist):

Dein Schleifenbeispiel scheitert daran, dass Variablen in Batch grundsätzlich nur einmalig am Beginn eines Blockes (wie eben einer "for"-Schleife oder eines "if"-Konstruktes) durch ihren Inhalt ersetzt ("aufgelöst") werden - soll dies auch innerhalb des Blockes erfolgen, so kann dies durch
ermöglicht werden. Dadurch ändert sich die Variablenschreibweise von
auf
was den unangenehmen Nebeneffekt mit sich bringt, dass "!" als Variablenbegrenzer (und nicht mehr als gewöhnliche Zeichen) interpretiert werden (und damit aus dem Variableninhalt "verschwinden", und falls sie paarweise auftreten, den dazwischen liegenden Text zumeist gleich "mitnehmen", da dieser Text als Variablenname verstanden wird und der Interpreter versucht, ihn durch seinen Wert zu ersetzen).

Zum tatsächlichen Rechnen mit den gespeicherten Werten für Beginn- und Endzeit hast Du ja schon eine passende Formel gefunden - diese wandelt die Zeitangabe in Hundertstelsekunden um.

Um allerdings die einzelnen Bestandteile ("tokens") der Zeit (also h, m, s und c) zu erhalten, muss der Zeitstring mittels "for /f"-Schleife aufgespalten werden (wobei als Trennzeichen = "delimiter" Doppelpunkt und Komma dienen):
Der erste Bestandteil wird der (angegebenen) Schleifenvariablen %%a zugewiesen, für die weiteren "tokens" geht es einfach alphabetisch weiter (%%b bis %%d).

Damit die Berechnung dann aber nicht zu einfach wird, gibt es noch eine kleine Hürde zu überweinden: Mit der Ziffer 0 beginnende Zahlenwerte werden als Oktalzahlen interpretiert, was für 00 bis 07 unproblematisch ist, für 08 und 09 aber (begreiflicher Weise) zu einem Fehler führt - Lösung: Setze vor die (zweistellige) Zahl eine 1 (wodurch etwa "109" entsteht) und subtrahiere 100, sodass nur noch die /Dezimal-)Zahl (9) als Ergebnis verbleibt.

Daraus folgt etwa folgender Code für eine Zeitberechnung:
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.
Damit sollte
3) Wie berechne ich die benötigte Zeit aus?
weitgehend abgedeckt sein, ...
... womit noch die Frage
2) Wie kriege ich alle Dateien eins Ordners in eine Variable (array)?
bliebe - diese allerdings animiert gleich zur Gegenfrage: "Wozu ein Array?" ( - das gibt es nämlich, wie Du schon herausgefunden hast, in CMD tatsächlich nicht.)

Grüße
bastla
Mitglied: miniversum
miniversum 12.11.2008 um 21:41:20 Uhr
Goto Top
Da hast du mehrere Dinge nicht richtig (verstanden).
1. delims und tokens beim For:
Delims gibt die Trennzeichen an.
Tokens sind die Elemente (die durch die Trennziechen getrennt werden) die du haben willst.
Hier ein Paar Beispiele:
FOR /F "tokens=1,2,3 delims=:" %%i in ('echo x:y:z') do echo [%%i] [%%j] [%%k]
FOR /F "tokens=2 delims=:" %%i in ('echo x:y:z') do echo [%%i] [%%j] [%%k]
FOR /F "tokens=1,3 delims=:" %%i in ('echo x:y:z') do echo [%%i] [%%j] [%%k]
2. SET /A %end=%time% funktioniert nicht. Wenn dann SET end=%time%
3. Variabeln in einer klamer (in for oder in if) werden zu beginn des geklammerten blockes aufgelöst. Darin werden sie nicht aktualisiert. Bei for hilft hier meistens der Aufruf einer Unterprozedur mit Übergabe des Variabeln aus For mit "call". In der Unterprozedur werden dann die Vatiabeln wieder aufgelöst. Alternativ könnte man enabledelayedexpansion nutzen (siehe der befehl setlocal). dann muß man die variabeln allerdings mit ! statt mit % markieren.
4. Das errechnen der Zeitdifferenz:
Der Ansatz ist das aufnahmen der Beginnzeit, dann die Aktion, dann das aufnehmen der Endzeit. Danach das verrechnen jeder einzelnen Zeit.

Edit: Ok ich war langsamer....
Mitglied: anve
anve 14.11.2008 um 11:23:36 Uhr
Goto Top
Hallo ihr!

Vielen Dank für eure hilfreichen Erklärungen!

Eine weitere Frage hätte ich noch? Wann nehme ich
und wann

Zitat von @bastla:
... womit noch die Frage
>2) Wie kriege ich alle Dateien eins Ordners in eine Variable
(array)?
bliebe - diese allerdings animiert gleich zur Gegenfrage: "Wozu
ein Array?" ( - das gibt es nämlich, wie Du schon
herausgefunden hast, in CMD tatsächlich nicht.
)

Ich brauche ja nicht unbedingt ein Array, aber wie hantle ich mich durch die ganzen Dateien in einem Ordner (muss nicht rekursiv sein) durch? Schon klar mit einer for-Schleife aber wie mache ich das?

Das müsste wahrscheinlich so irgendwie gehen (aber ohne es jetzt als Datei auszugeben):

Oder wäre die einzige Möglichkeit das als Datei auszugeben, wieder einzulesen und die Anzahl der Zeilen zu zählen und anschließend Zeile für Zeile durchgehen?

LG
anve
Mitglied: miniversum
miniversum 14.11.2008 um 11:43:06 Uhr
Goto Top
Wenn du an der Eingabeaufforderung set /? eingibst erhälst du die Hilfe zum Set Befehl. Dort steht unter anderem:
Die /A-Option gibt an, dass die Zeichenfolge rechts vom Gleichheitszeichen
ein nummerischer Ausdruck ist, der ausgewertet wird. Das Auswertungsprogramm
des Ausdrucks unterstützt dabei die folgenden Vorgänge, entsprechend ihrer
Anordnung mit abnehmendem Vorrang:

() - Gruppierung
! ~ - - monäre Operatoren
          • / % - arithmetische Operatoren
          + - - arithmetische Operatoren
          << >> - logische Verschiebung
          & - bitweise UND
          ^ - bitweise exklusives ODER
          | - bitweise ODER
          = *= /= %= += -= - Zuordnung
          &= ^= |= <<= >>=
          , - Trennzeichen für Ausdrücke

          Wenn Sie einen der arithmetischen oder Moduloperatoren verwenden, müssen
          Sie die Zeichenfolge für den Ausdruck in Anführungszeichen setzen. Alle
          nicht-nummerischen Zeichenfolgen im Ausdruck werden als Zeichenfolgen von
          Umgebungsvariablen behandelt, deren Werte vor der Verwendung in Zahlen
          konvertiert werden. Wenn eine Umgebungsvariable angegeben wird, die nicht
          definiert ist, wird für diese der Wert Null verwendet. Somit können Sie
          mit Umgebungsvariablen Berechnungen vornehmen, ohne %-Zeichen einzugeben,
          um deren Werte zu erhalten. Wenn der Befehl SET /A von der Befehlszeile,
          d.h. außerhalb eines Befehlsskripts ausgeführt wird, dann zeigt er
          den endgültigen Wert des Ausdrucks an. Der Zuordnungsoperator erfordert
          eine Umgebungsvariable auf der linken Seite des Operators. Nummerische Werte
          stellen immer Dezimalzahlen dar, es sei denn, sie haben ein Präfix 0x für
          hexadezimale Zahlen, 0b für binäre Zahlen oder 0 für oktale Zahlen. Damit
          stellt 0x12 dieselbe Zahl wie 18 oder 022 dar. Beachten Sie, dass die oktale
          Schreibweise verwirrend sein kann: So sind 08 und 09 keine gültigen Zahlen,
          da 8 und 9 keine erlaubten oktalen Ziffern sind.

Mit dem Forbefehl kansn tud eine Liste (aus einer Datei oder einem Verzeichnis) durchgehen.
Das geht entweder so:
FOR /R x:\Pfad %i IN (*.*) DO echo %i
oder so:
dir /d /on /b > liste.txt
FOR /F "delims=" %i in (liste.txt) do echo %i
oder abgekürzt:
FOR /F "delims=" %i in ('dir /d /on /b') do echo %i

Mitglied: bastla
bastla 14.11.2008 um 11:44:58 Uhr
Goto Top
Hallo anve!

Eine weitere Frage hätte ich noch? Wann nehme ich
SET /A %i=0
und wann
set Variable=%time%
Die Antwort solltest Du eigentlich mit "set /?" schon gefunden haben: "/A" steht für "arithmetisch" - dies dann, wenn eine Berechnung vorgenommen oder zumindest darauf hingewiesen werden soll, dass eine numerische Variable gemeint ist.

wie hantle ich mich durch die ganzen Dateien in einem Ordner
Im einfachsten Fall (steht bei "for /?" ;-) face-wink) mit
Ansonsten mit
Das "delims=" ersetzt die Standardtrennzeichen Leerzeichen und TAB durch "Nichts", wodurch der Dateiname nicht nur bis zum ersten enthaltenen Leerzeichen in %%i übernommen wird - deshalb dann auch die Anführungszeichen, da ja in %%i so auch ein oder mehrere Leerzeichen enthalten sein können (was zwar für "echo" egal wäre, nicht allerdings für "ren", "copy", "move", etc).

Die "for /f"-Variante ist dann sinnvoll (bzw notwendig), wenn Du eine Sortierung benötigst oder eine Einschränkung (wie hier: "/a-d" für "keine Verzeichnisse") vornehmen willst.

Grüße
bastla

[Edit] @miniversum 1:1 ;-) face-wink [/Edit]
Mitglied: anve
anve 14.11.2008 um 18:51:46 Uhr
Goto Top
Ein herzliches Dankeschön an miniversum & bastla!

Ihr habt mir wirklich geholfen! Die Antworten kamen auch immer gleich! Ihr seid toll!

GLG
anve
Heiß diskutierte Beiträge
general
Telekom hat größere Störung gelöst anteNopeVor 1 TagAllgemeinInformationsdienste30 Kommentare

Moin, es scheint als hätte die Telekom gerade eine größere Störung. Bei vielen Kunden mit Telekom-Internetanschluss funktionieren Office 365 und auch IMAP-Mails nicht. Wartezeit in ...

question
Windows 365SarekHLVor 1 TagFrageWindows 1113 Kommentare

Hallo zusammen, nun ist es also soweit - Microsoft stellt mit "Windows 365" die Weichen in Richtung Windows as a Service: Wenn Microsoft da schreibt ...

question
Massive Probleme mit Windows Suche, Taskbar, Windows Standard Apps auf jedem Windows 10-PC im Firmennetzwerkrznr666Vor 1 TagFrageWindows 1027 Kommentare

Hallo liebe Community, die PCs in unserem Unternehmen weisen folgende Probleme auf. Die Fehler treten nach einiger Zeit auf JEDEM Windows 10-PC auf, der genaue ...

question
Absicherung Exchange ServerLKleemannVor 1 TagFrageExchange Server10 Kommentare

Hallo zusammen, wir sind bei uns in der Firma nun endlich vom Exchange POP3 Connector weggekommen und empfangen nun unsere E-Mail direkt über MX-Einträge. Nun ...

question
Anmeldeprobleme w10 auf server2012fisch56Vor 1 TagFrageWindows Server16 Kommentare

Hallo allerseits, mich bringt es fast um. Server 2012R, 7 Arbeitsstationen, alle haben einen Zugriff auf den Server, dort sind 2 Programme, alles läuft easy. ...

report
Erfahrungsbericht Vodafone - All your Verträge belong to us!anteNopeVor 1 TagErfahrungsberichtFlatrates12 Kommentare

Hallo zusammen, da the-buccaneer so nett gebeten hat, hier eine weitere Erfahrung mit und von Voodoofone. Es begab sich zur Zeit zu Weihnachten vor 3 ...

info
Happy System Administrator Appreciation Day0xFFFFVor 15 StundenInformationHumor (lol)7 Kommentare

Guten Morgen Byteschubser, ihr seid die superhelden der Wirtschaft! _Danke dass es euch (uns #eigenlob) gibt. Mögen Eure Systeme stets Viren- und Hackerfrei bleiben, eure ...

question
Robocopy - FEHLER 0 (0x00000000)emeriksVor 1 TagFrageBatch & Shell10 Kommentare

Hi, habe ich hier einen täglichen Copy Job, wo Robocopy plötzlich "Fehler 0" meldet, dass es erfolgreich sei, aber nichts kopiert. Festplatte des NAS ist ...