Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: FloFlo

FloFlo (Level 1) - Jetzt verbinden

29.05.2007, aktualisiert 03.06.2007, 9136 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 ..
Ähnliche Inhalte
Batch & Shell
Batch Schleife als FOR-SCHLEIFE
gelöst Frage von mp2711Batch & Shell2 Kommentare

Mit den FOR-Schleifen habe ich mich leider bislang zu selten auseinander gesetzt, aber da ich sonst gerade nicht weiter ...

Batch & Shell
Ergebnis in Text datei ausgeben
gelöst Frage von caschoplBatch & Shell2 Kommentare

Hallo, irgendwie stehe ich auf dem schlauch. Habe folgende Batch erstellt, aber der Text wier immer überschrieben. Das ergebnis ...

Batch & Shell
Batch Problem bei einer For Schleife
gelöst Frage von Juergen42Batch & Shell2 Kommentare

Hallo Ich komme nicht dahinter ist sicher nur ein kleines Problem, aber es wird keine Ausgabe gemacht Eigentlch willich ...

Batch & Shell
Batch - Hilfe bei FOR-Schleife
gelöst Frage von makroll10Batch & Shell8 Kommentare

Hallo, aus einer Access-Datenbank heraus rufe ich per VBA den u.a. Batch mit den Parametern: Reports!UB_System!Pfad ("C:\Users\User\Documents\Polar\") und Reports!UB_Polar!hrmexport1 ...

Neue Wissensbeiträge
Sicherheit

MikroTik-Router patchen, Schwachstelle wird ausgenutzt

Information von kgborn vor 17 StundenSicherheit

Am 23. April 2018 wurde von Mikrotik ein Security Advisory herausgegeben, welches auf eine Schwachstelle im RouterOS hinwies. Mikrotik ...

Windows 10

Microcode-Updates KB4090007, KB4091663, KB4091664, KB4091666 für Windows 10

Information von kgborn vor 23 StundenWindows 101 Kommentar

Kurze Information für Administratoren von Windows 10-Systemen, die mit neueren Intel CPUs laufen. Microsoft hat zum 23. April 2018 ...

iOS
Updates für Iphone und Co
Information von sabines vor 1 TagiOS

Gestern abend ist iOS 11.3.1 erschienen, ein kleineres Update, dass einige Lücken schließt und "Lahmlegen" nach einem Display Tausch ...

Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 2 TagenWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Heiß diskutierte Inhalte
Batch & Shell
Powershell: Im AD nach Rechnern mit bestimmten IP-Adressen suchen
gelöst Frage von Raven42Batch & Shell36 Kommentare

Hallo zusammen, ich suche nach einer Möglichkeit nach Computern im AD zu suchen , deren IP-Adresse mit 10.11.12. beginnt. ...

C und C++
Frage1 C Programmierung-Makefile Frage2 PHP-Programmierung HTTP-Fehler 404
Frage von KatalinaC und C++34 Kommentare

Hallo, ich habe 2 Fragen, die nichts miteinander zu tun haben aber mit denen ich mich gerade beschäftige: 1. ...

LAN, WAN, Wireless
Watchguard T15 VPN Einrichtung
gelöst Frage von thomasjayLAN, WAN, Wireless25 Kommentare

Hallo zusammen, wir möchten gerne über unsere Watchguard T15 einen VPN-Tunnel (Mobile VPN with IPSec) einrichten! Als Client nutzen ...

Windows Server
Alten DC entfernen
Frage von smartinoWindows Server24 Kommentare

Hallo zusammen, ich habe hier eine Umgebung übernommen und erstmal einen DCDIAG gemacht. Dabei fällt auf, daß eine ganze ...