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

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

Frage Entwicklung Batch & Shell

Mitglied: FloFlo

FloFlo (Level 1) - Jetzt verbinden

29.05.2007, aktualisiert 03.06.2007, 8836 Aufrufe, 8 Kommentare

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:

01.
@echo off 
02.
SET TEST=TEST 
03.
IF NOT !TEST!==TEST ( 
04.
  ECHO Die verzoegerte Variablenerweiterung ist nicht aktiviert! 
05.
  ECHO Es wird eine neue Shell mit aktivierter Erweiterung gestartet 
06.
  ECHO und die Batchdatei darin ausgefuehrt. 
07.
 
08.
  START "Name des Fensters" cmd /v /c "Dateiname.bat" 
09.
 
10.
  GOTO :EOF 
11.
12.
 
13.
echo Drücken Sie eine beliebige Taste um das Programm zu starten 
14.
pause > nul 
15.
set nummerges=0 
16.
for %%f in (*.exe) do set /a nummerges+=1 
17.
set nummer=0 
18.
for %%d in (*.exe) do ( 
19.
set /a nummer+=1 
20.
set /a prozent=(%nummer%/%nummerges%)*100 
21.
cls 
22.
echo. 
23.
echo Dateien werden kopiert 
24.
echo. 
25.
echo Schon %prozent% kopiert 
26.
copy %%d C:... 
27.
28.
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
Mitglied: miniversum
29.05.2007 um 16:51 Uhr
Versuchs mal so (hab nur mal den unteren Teil gepostet):
01.
setlocal enabledelayedexpansion 
02.
set nummerges=0 
03.
for %%f in (*.exe) do set /a nummerges+=1 
04.
set nummer=0 
05.
for %%d in (*.exe) do ( 
06.
set /a nummer+=1 
07.
set /a prozent=(!nummer!/!nummerges!)*100 
08.
cls 
09.
echo. 
10.
echo Dateien werden kopiert 
11.
echo. 
12.
echo Schon !prozent! kopiert 
13.
copy "%%d" C:... 
14.
15.
pause
miniversum
Bitte warten ..
Mitglied: FloFlo
29.05.2007 um 17:16 Uhr
Nein,funktioniert leider immer noch nicht.

Mein Code sieht jetzt so aus (mit ein paar Pause-Befehlen):
01.
@echo off 
02.
echo Drücken Sie eine beliebige Taste um das Programm zu starten 
03.
pause > nul 
04.
setlocal enabledelayedexpansion 
05.
set nummerges=0 
06.
for %%f in (*.exe) do set /a nummerges+=1 
07.
set nummer=0 
08.
echo %nummerges% 
09.
pause  <---- Wird angezeigt 
10.
for %%d in (*.exe) do ( 
11.
pause  <---- Wird nicht mehr angezeigt 
12.
set /a nummer+=1 
13.
set /a prozent=(!nummer!/!nummerges!)*100 
14.
cls 
15.
echo. 
16.
echo Dateien werden kopiert 
17.
echo. 
18.
echo Schon !prozent! kopiert 
19.
copy "%%d" C:\... 
20.
21.
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
01.
START "Name des Fensters" cmd /v /c "Dateiname.bat"
gelöcht!


FloFlo
Bitte warten ..
Mitglied: FloFlo
29.05.2007 um 17:41 Uhr
Ich habe noch mal ein bisschen rumprobiert und etwas erstaunliches festgestellt:

Mein Code
01.
@echo off 
02.
echo Drücken Sie eine beliebige Taste um das Programm zu starten 
03.
pause > nul 
04.
setlocal enabledelayedexpansion 
05.
set nummerges=0 
06.
for %%f in (*.exe) do set /a nummerges+=1 
07.
set nummer=0 
08.
echo %nummerges% 
09.
pause 
10.
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:\... 
11.
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
Bitte warten ..
Mitglied: miniversum
29.05.2007 um 17:57 Uhr
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
Bitte warten ..
Mitglied: FloFlo
29.05.2007 um 18:20 Uhr
@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:

01.
Führt einen Befehl für jede einzelne Datei für einen Satz von Dateien aus. 
02.
 
03.
FOR %Variable IN (Satz) DO Befehl [Parameter]
Also eine Klammer bei Befehl steht da nicht drin...


FloFlo
Bitte warten ..
Mitglied: Biber
01.06.2007 um 21:10 Uhr
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:
01.
 Wenn Sie einen der arithmetischen oder Moduloperatoren verwenden, müssen 
02.
Sie die Zeichenfolge für den Ausdruck in Anführungszeichen setzen. Alle 
03.
nicht-nummerischen Zeichenfolgen im Ausdruck werden als Zeichenfolgen von 
04.
Umgebungsvariablen behandelt, deren Werte vor der Verwendung in Zahlen 
05.
konvertiert werden. Wenn eine Umgebungsvariable angegeben wird, die nicht 
06.
definiert ist, wird für diese der Wert Null verwendet. <b>Somit können Sie 
07.
mit Umgebungsvariablen Berechnungen vornehmen, ohne %-Zeichen einzugeben, 
08.
um deren Werte zu erhalten.</b> Wenn der Befehl SET /A von der Befehlszeile, 
09.
d.h. außerhalb eines Befehlsskripts ausgeführt wird, dann zeigt er 
10.
den endgültigen Wert des Ausdrucks an. Der Zuordnungsoperator erfordert 
11.
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):
01.
@echo off 
02.
echo Drücken Sie eine beliebige Taste um das Programm zu starten 
03.
pause > nul 
04.
setlocal enabledelayedexpansion 
05.
set nummerges=0 
06.
for %%f in (*.txt) do set /a nummerges+=1 
07.
set nummer=0 
08.
echo %nummerges% 
09.
pause 
10.
for %%d in (*.txt) do ( 
11.
REM pause 
12.
set /a nummer+=1 
13.
set /a "prozent1=!nummer! *100 / !nummerges!" 
14.
set /a prozent2=!nummer! *100 / !nummerges! 
15.
set /a "prozent3=nummer *100 / nummerges" 
16.
set /a "prozent4=(!nummer! *100 ) / !nummerges!" 
17.
 
18.
cls 
19.
echo. 
20.
echo Dateien werden kopiert 
21.
echo. 
22.
echo Schon [1]!prozent1!%% [2]!prozent2!%% [3]!prozent3!%% [4]!prozent4!%% kopiert 
23.
echo copy "%%d" C:\.. 
24.
sleep 1 
25.
26.
pause
Alle 4 Syntaxvarianten bringen das gleiche (richtige) Ergebnis, nämlich ganzzahlige Prozentwerte. Beispiel (irgendwo abgebrochen, damit das auch zu sehen ist):
01.
Dateien werden kopiert 
02.
 
03.
Schon [1]16% [2]16% [3]16% [4]16% kopiert 
04.
copy "dateiB.txt" C:\.. 
05.
^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
Bitte warten ..
Mitglied: FloFlo
03.06.2007 um 16:09 Uhr
Vielen Dank für die ausführliche Antwort.

FloFlo
Bitte warten ..
Mitglied: Biber
03.06.2007 um 16:53 Uhr
@FloFlo
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...