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:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 60089
Url: https://administrator.de/forum/mit-batch-dateien-in-for-schleifen-rechnen-und-ergebnis-am-bildschirm-ausgeben-60089.html
Ausgedruckt am: 15.05.2025 um 05:05 Uhr
8 Kommentare
Neuester Kommentar
Versuchs mal so (hab nur mal den unteren Teil gepostet):
miniversum
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
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:
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
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
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:
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
Eine Demo vorher (aufbauend auf Deinem Schnipsel):
Alle 4 Syntaxvarianten bringen das gleiche (richtige) Ergebnis, nämlich ganzzahlige Prozentwerte. Beispiel (irgendwo abgebrochen, damit das auch zu sehen ist):
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:
Ändere die "prozent2"-Zeile oben im Skript:
---> "/" 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
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
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
Dateien werden kopiert
Schon [1]16% [2]16% [3]16% [4]16% kopiert
copy "dateiB.txt" C:\..
^CBatchvorgang abbrechen (J/N)?
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
@FloFlo

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
Vielen Dank für die ausführliche Antwort.
War ja auch eine ausführliche und klare Fragestellung. 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