floflo
Goto Top

Mit Batch-Dateien in for-Schleifen rechnen und Ergebnis am Bildschirm ausgeben

Hi,

ich habe eine Frage zu meiner Batch-Datei:

Sie soll: Alle Dateien eines Dateityps kopieren. Während des Kopiervorgangs soll meine bat-Datei anzeigen,wie viele Dateien sie schon kopiert hat (auch in Prozent).

Ich habe schon in diversen Foren nach einer Lösung gesucht,leider bricht die Datei immer in der 2.For-Schleife ab.

Ich habe auch schon etwas von einer verzögerte Variablenerweiterung gelesen,allerdings weiß ich nicht genau was das ist...

Meine bat-Datei:

@echo off
SET TEST=TEST
IF NOT !TEST!==TEST (
  ECHO Die verzoegerte Variablenerweiterung ist nicht aktiviert!
  ECHO Es wird eine neue Shell mit aktivierter Erweiterung gestartet
  ECHO und die Batchdatei darin ausgefuehrt.

  START "Name des Fensters" cmd /v /c "Dateiname.bat"  

  GOTO :EOF
)

echo Drücken Sie eine beliebige Taste um das Programm zu starten
pause > nul
set nummerges=0
for %%f in (*.exe) do set /a nummerges+=1
set nummer=0
for %%d in (*.exe) do (
set /a nummer+=1
set /a prozent=(%nummer%/%nummerges%)*100
cls
echo.
echo Dateien werden kopiert
echo.
echo Schon %prozent% kopiert
copy %%d C:...
)
pause

Zur Erläuterung der Variablen:
nummerges: Die Nummer aller exe-Dateien,die kopiert werde
nummer: Die Nummer der aktuell kopierten Datei ( Soll in der Schleife um jeweils 1 erhöht werden)
prozent: Rechnet aus,wie viel Prozent bereits kopiert wurden

Die Variable nummerges wird korrekt ausgerechnet.


Vielen Dank für die Hilfe

FloFlo

Content-Key: 60089

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

Printed on: April 20, 2024 at 03:04 o'clock

Member: miniversum
miniversum May 29, 2007 at 14:51:51 (UTC)
Goto Top
Versuchs mal so (hab nur mal den unteren Teil gepostet):
setlocal enabledelayedexpansion
set nummerges=0
for %%f in (*.exe) do set /a nummerges+=1
set nummer=0
for %%d in (*.exe) do (
set /a nummer+=1
set /a prozent=(!nummer!/!nummerges!)*100
cls
echo.
echo Dateien werden kopiert
echo.
echo Schon !prozent! kopiert
copy "%%d" C:...  
)
pause

miniversum
Member: FloFlo
FloFlo May 29, 2007 at 15:16:16 (UTC)
Goto Top
Nein,funktioniert leider immer noch nicht.

Mein Code sieht jetzt so aus (mit ein paar Pause-Befehlen):
@echo off
echo Drücken Sie eine beliebige Taste um das Programm zu starten
pause > nul
setlocal enabledelayedexpansion
set nummerges=0
for %%f in (*.exe) do set /a nummerges+=1
set nummer=0
echo %nummerges%
pause  <---- Wird angezeigt
for %%d in (*.exe) do (
pause  <---- Wird nicht mehr angezeigt
set /a nummer+=1
set /a prozent=(!nummer!/!nummerges!)*100
cls
echo.
echo Dateien werden kopiert
echo.
echo Schon !prozent! kopiert
copy "%%d" C:\...  
)
pause

Das erstaunliche (für mich jedenfalls) ist,das die Datei den 1.Pause-Befehl anzeigt,aber den 2. nicht mehr. (also nach dem 1. Pause-Befehl bricht die Datei ab)

Ich habe jetzt mal den oberen Code
START "Name des Fensters" cmd /v /c "Dateiname.bat"  
gelöcht!


FloFlo
Member: FloFlo
FloFlo May 29, 2007 at 15:41:57 (UTC)
Goto Top
Ich habe noch mal ein bisschen rumprobiert und etwas erstaunliches festgestellt:

Mein Code
@echo off
echo Drücken Sie eine beliebige Taste um das Programm zu starten
pause > nul
setlocal enabledelayedexpansion
set nummerges=0
for %%f in (*.exe) do set /a nummerges+=1
set nummer=0
echo %nummerges%
pause
for %%d in (*.exe) do set /a nummer+=1 & set /a prozent=((!nummer!/!nummerges!)*100) & cls & echo. & echo Dateien werden kopiert & echo. & echo Schon !nummer! von !nummerges! kopiert & echo Datei %%d wird kopiert & @copy "%%d" C:\...  
pause

Also ich habe bei der 2.For-Schleife alle Befehle in einer Zeile geschrieben und es funktioniert!!

  • Nur leider funtioniert das Prozent-Rechnen nicht: Es wird immer 0 ausgerechnet,außer beim letzten Durchlauf kommt 1 raus (sprich: es werden keine Nachkommastellen berechnet). Gibt es einen Trick dafür,sodass ich den Fortschritt auch in Prozent angeben kann?

  • Weiß jemand wie man die Meldung "1 Datei(en) kopiert" vom copy-Befehl unterdrücken kann?

  • Wieso geht die Datei nur,wenn ich die Befehle der Schleife in einer Zeile schreibe? In mehreren Zeilen würde das deutlich übersichtlicher aussehen. (ich benutze Win XP)


Wäre nett,wenn mit jemand darauf eine Antwort geben könnte

FloFlo
Member: miniversum
miniversum May 29, 2007 at 15:57:49 (UTC)
Goto Top
eigentlich sollte ja gerade die klammer dafür sorgend as du das alles auchuntereinander schreiben aknnst und nich tin eine Zeile. Von daher sehe ich auch nicht was das Problem sein kann.

Wegen dem Prozent... das liegt daran das du in diesen Variabeln nur mit ganzen Zahlen rechnen kannst. Du könntest allerdings zuerst *100 nehmen also so:
set /a prozent=((!nummer!*100)/!nummerges!))
Desweiteren kannst du mal beim Set Befehl % (modulo) verwenden. Der gibt dir immer den Rest aus. Dann must du halt erst die Stellen vor dem Komma errechnen und danach die Vorkomma- und die Nachkommastellen in der Anzeige halt zusammenfügen.

Die Meldung "1 Datei(en) kopiert" kannst du mit einem >NUL hinter dam Copy befehl unterdrücken. Fehlermeldungen beim kopieren werden dir dennoch ausgegeben. Willst du die auch weghaben must du nochmal ein 2>NUL dahinter schreiben.

miniversum
Member: FloFlo
FloFlo May 29, 2007 at 16:20:15 (UTC)
Goto Top
@miniversum: Vielen Dank

Also das wundert micht sehr,dass die for-schleifen nicht laufen,wie sie laufen sollten.
Ich benutze Win XP Home SP 2. Ich werde mal googlen,vllt finde ich etwas dazu.

Auch bei dem copy-Befehl werden mit einem >nul bei mir sowohl die Erfolgsmeldung als auch die Fehlermeldung unterdrückt...

EDIT:

Ist die Klammer in der For-Schleife überhaupt vorgesehen?

Weil wenn ich in der Eingabeaufforderung "for /?" eingebe erscheint:

Führt einen Befehl für jede einzelne Datei für einen Satz von Dateien aus.

FOR %Variable IN (Satz) DO Befehl [Parameter]

Also eine Klammer bei Befehl steht da nicht drin...


FloFlo
Member: Biber
Biber Jun 01, 2007 at 19:10:21 (UTC)
Goto Top
Moin FloFlo,

ja, da hast Du aus Versehen wieder eine weitere Skurrilität der Redmonder Programmierkünstler angekratzt...

Es ist ein bisschen buggy an dieser Stelle... aber nicht dort, wo Du den Verdacht hattest.
Es hat nicht damit zu tun, dass in FOR-Anweisungen keine Klammern erlaubt werden.
Es hat mit einem anderen von M$ halbherzig implementierten neuen Feature zu tun.

Es muss so gewesen sein....
Einer von M$s Praktikanten ist offensichtlich vorgeprescht mit dem neuen "SET /A"-Rechen-Feature.
Und das ist so grottenschlecht zusammengeharkt, dass ich gar nicht weiß, wo ich anfangen soll mit Lästern....
Ich hatte eigentlich schon im vorletzten Jahr vor, ein kleines Tut zusammenzuschreddern mit den skurrilsten Bugs in der (damals noch) relativ neuen CMD.exe, aber... warum sollte ich armer einsamer Enduser das tun und nicht Bills Qualitäts-Manager...
Anyhow... in der Hilfe "SET /?" steht unter anderem:
 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. <b>Somit können Sie
mit Umgebungsvariablen Berechnungen vornehmen, ohne %-Zeichen einzugeben,
um deren Werte zu erhalten.</b> 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

Na ja... so weit, so wahr.
Ein anderer Praktikant ist offensichtlich parallel dazu losgelaufen mit der Vision einer "verzögerten Variablenauflösung" und hat dieses Feature zusammengeklimpert.
So gut er konnte. Was nicht viel heißen muss.

Diesem Treiben hat offensichtlich das Produktmanagement tatenlos zugesehen nach dem Motto: "Die kann ich eh' nicht aufhalten - außerdem ist Windows ja nicht für mich, sondern nur zum Verkaufen. Was ich nicht verhindern kann, mache ich zum Standard."
Kennst Du ja.

Herausgekommen ist, dass bei gleichzeitigem Eintreten von
  • eingeschalteter DelayedExpansion
  • nummerischen Variablen in einer "Set /A"-Anweisung
  • Verwendung von runden Klammern in dieser SET /A - Anweisung
... sich der CMD-Interpreter beim Parsen regelmäßig um eine KlammerZu ")" verzählt.

Eine Demo vorher (aufbauend auf Deinem Schnipsel):
@echo off
echo Drücken Sie eine beliebige Taste um das Programm zu starten
pause > nul
setlocal enabledelayedexpansion
set nummerges=0
for %%f in (*.txt) do set /a nummerges+=1
set nummer=0
echo %nummerges%
pause
for %%d in (*.txt) do (
REM pause
set /a nummer+=1
set /a "prozent1=!nummer! *100 / !nummerges!"  
set /a prozent2=!nummer! *100 / !nummerges!
set /a "prozent3=nummer *100 / nummerges"  
set /a "prozent4=(!nummer! *100 ) / !nummerges!"  

cls
echo.
echo Dateien werden kopiert
echo.
echo Schon [1]!prozent1!%% [2]!prozent2!%% [3]!prozent3!%% [4]!prozent4!%% kopiert
echo copy "%%d" C:\..  
sleep 1
)
pause
Alle 4 Syntaxvarianten bringen das gleiche (richtige) Ergebnis, nämlich ganzzahlige Prozentwerte. Beispiel (irgendwo abgebrochen, damit das auch zu sehen ist):
Dateien werden kopiert

Schon [1]16% [2]16% [3]16% [4]16% kopiert
copy "dateiB.txt" C:\..  
^CBatchvorgang abbrechen (J/N)?
Die gute Nachricht zuerst:
Wie zu sehen ist - Du kannst bei "SET /A" auf die Ausrufungszeichen verzichten.
Die CMD.exe nimmt immer die "verzögert aufgelösten" Werte.

Die schlechte Nachricht:
Machst Du das nicht, sondern verwendest die !-Syntax, dann...
Ändere die "prozent1"- Zeile oben im Skript:
set /a "prozent1=!nummer! *100 / !nummerges!)"
---> eine KlammerZu zuviel am Ende ---> probiere es aus. ES FUNKTIONIERT

Ändere die "prozent2"-Zeile oben im Skript:
set /a prozent2=(!nummer! *100) / !nummerges!
> "gültige" und paarige runde Klammern um Teil-Rechnungen...
---> "/" ist syntaktisch an dieser Stelle nicht verarbeitbar. sacht die CMD.exe....

Vergleiche es mit der undokumentierten so genannten Biber-Syntax bei "prozent4".
--> wenn Du es wiederum in Anführungszeichen verpackst, dann klappt es.

So, ich hoffe, damit ist auch dieses Thema hinreichend beantwortet.

Schönes Wochenende
Biber
Member: FloFlo
FloFlo Jun 03, 2007 at 14:09:31 (UTC)
Goto Top
Vielen Dank für die ausführliche Antwort.

FloFlo
Member: Biber
Biber Jun 03, 2007 at 14:53:00 (UTC)
Goto Top
@FloFlo
Vielen Dank für die ausführliche Antwort.
War ja auch eine ausführliche und klare Fragestellung. face-wink

Ich schliesse den Beitrag mal...
Falls aber jemand noch weiter gehende Infos bzw. Erkenntnisse hat, dann bitte per PN an mich öffnen lassen.

Grüße
Biber