Batchprogrammierung - FOR Schleifen - Speichern in Variablen - Ausgabe der Variablen
Guten Tag zusammen,
ich habe ein kleines Problem und komme alleine nicht weiter.
Folgende Situation:
Ich hab ein Batchprogramm geschrieben, welches all unsere Netlogon Skripts liest, eine Änderung daran durchführt und anschließend in ein neues Verzeichnis kopiert(Ungefähr 400 Dateien).
Nun würde ich gerne eine Integritätsprüfung des Inhalts der neuen Version einer Batchdatei durchführen..
Das ist der Inhalt der Prüfdatei:
Mit der zweiten For-Schleife kann ich mithilfe des Befehls "findstr /n .*" und dem Delimiter ":" die Zeilennummer ausfindig machen und diese dann in %%g speichern.
Mein Problem ist jetzt, dass ich erstmal durch Zeile 17 eine Ausgabedatei erstellen möchte, welche mir pro Batchdatei anzeigt wie viele Zeilen diese hat. Nur irgendwie funktioniert das setzten der %Counter%-Variable nicht und ich finde in der Ausgabedatei nur folgenden Inhalt:
-> Sprich ohne eine Zahl hinter dem ":"
mit "Do set Counter=%%g" kann ich doch die Variable %Counter% befüllen und anschließend in der ersten Schleife wieder verwenden oder nicht?
Was mache ich falsch?
Danke schon mal für eure Antworten
Gruß
ich habe ein kleines Problem und komme alleine nicht weiter.
Folgende Situation:
Ich hab ein Batchprogramm geschrieben, welches all unsere Netlogon Skripts liest, eine Änderung daran durchführt und anschließend in ein neues Verzeichnis kopiert(Ungefähr 400 Dateien).
Nun würde ich gerne eine Integritätsprüfung des Inhalts der neuen Version einer Batchdatei durchführen..
Das ist der Inhalt der Prüfdatei:
@echo off
set ziel=C:\Users\name\Desktop\Logon-Skript_umschreiben\Daten\Neu\test\
set dateinamen=C:\Users\name\Desktop\Logon-Skript_umschreiben\valid\dateinamen.txt
set ausgabe=C:\Users\name\Desktop\Logon-Skript_umschreiben\valid\ausgabe.txt
del %dateinamen% > nul
del %ausgabe% > nul
pushd %ziel%
dir /B *.bat > %dateinamen%
For /f "delims=" %%i in (%dateinamen%) do echo %%i & (For /f "delims=:" %%g in ('findstr /n .* %ziel%%%i') DO SET Counter=%%g)& echo %%i:%Counter%>>%ausgabe%
pause
Mit der zweiten For-Schleife kann ich mithilfe des Befehls "findstr /n .*" und dem Delimiter ":" die Zeilennummer ausfindig machen und diese dann in %%g speichern.
Mein Problem ist jetzt, dass ich erstmal durch Zeile 17 eine Ausgabedatei erstellen möchte, welche mir pro Batchdatei anzeigt wie viele Zeilen diese hat. Nur irgendwie funktioniert das setzten der %Counter%-Variable nicht und ich finde in der Ausgabedatei nur folgenden Inhalt:
test.bat:
test10.BAT:
test2.BAT:
test3.BAT:
test4.BAT:
test5.BAT:
test7.bat:
test8.bat:
test9.BAT:
mit "Do set Counter=%%g" kann ich doch die Variable %Counter% befüllen und anschließend in der ersten Schleife wieder verwenden oder nicht?
Was mache ich falsch?
Danke schon mal für eure Antworten
Gruß
6 Antworten
- LÖSUNG Biber schreibt am 15.03.2016 um 14:09:29 Uhr
- LÖSUNG JimStar schreibt am 15.03.2016 um 14:19:45 Uhr
- LÖSUNG JimStar schreibt am 15.03.2016 um 14:39:45 Uhr
- LÖSUNG MrCount schreibt am 15.03.2016 um 14:59:26 Uhr
- LÖSUNG JimStar schreibt am 15.03.2016 um 15:15:57 Uhr
- LÖSUNG MrCount schreibt am 15.03.2016 um 15:32:27 Uhr
- LÖSUNG JimStar schreibt am 15.03.2016 um 15:15:57 Uhr
- LÖSUNG MrCount schreibt am 15.03.2016 um 14:59:26 Uhr
- LÖSUNG JimStar schreibt am 15.03.2016 um 14:39:45 Uhr
- LÖSUNG JimStar schreibt am 15.03.2016 um 14:19:45 Uhr
LÖSUNG 15.03.2016, aktualisiert um 14:49 Uhr
Moin Jimstar,
wenn du einen Variablenwert innerhalb einer Anweisung, zB einer FOR-Anweisung mehrfach aktualisieren/auslesen müsstest, dann ginge das mit setlocal EnableDelayedExpansion aund "verzögerter Variablenauflösung".
Nach diesen Stichworten kannst du hier im Forum suchen und finden.
aber: in deinem Fall benötigst du die variable "Counter" ja nicht wirklich.
Also ändere die Zeile 17 auf
Grüße
Biber
wenn du einen Variablenwert innerhalb einer Anweisung, zB einer FOR-Anweisung mehrfach aktualisieren/auslesen müsstest, dann ginge das mit setlocal EnableDelayedExpansion aund "verzögerter Variablenauflösung".
Nach diesen Stichworten kannst du hier im Forum suchen und finden.
aber: in deinem Fall benötigst du die variable "Counter" ja nicht wirklich.
Also ändere die Zeile 17 auf
...
For /f "delims=" %%i in (%dateinamen%) do echo %%i & (For /f "delims=:" %%g in ('findstr /n .* %ziel%%%i') DO echo %%i:%%g>>%ausgabe%
Grüße
Biber
LÖSUNG 15.03.2016 um 14:19 Uhr
Hallo Biber,
deine Lösung hatte ich auch schon versucht, das Ergebnis davon ist aber folgendes:
Inhalt Ausgabedatei:
Die Ausgabe des Inhalts der Variable %%g muss also außerhalb der zweiten Schleife passieren, sprich in der ersten Schleife.
So zum Beispiel(Was aber auch nicht funktioniert):
deine Lösung hatte ich auch schon versucht, das Ergebnis davon ist aber folgendes:
Inhalt Ausgabedatei:
test.bat:1
test.bat:2
test.bat:3
test.bat:4
test.bat:5
test.bat:6
test.bat:7
test.bat:8
test.bat:9
test.bat:10
test.bat:11
test.bat:12
test.bat:13
test.bat:14
test.bat:15
test.bat:16
test.bat:17
test.bat:18
test.bat:19
test.bat:20
test.bat:21
test.bat:22
test10.BAT:1
test10.BAT:2
test10.BAT:3
test10.BAT:4
test10.BAT:5
test10.BAT:6
test10.BAT:7
test10.BAT:8
test10.BAT:9
test10.BAT:10
test10.BAT:11
test10.BAT:12
test10.BAT:13
test10.BAT:14
test10.BAT:15
test10.BAT:16
test10.BAT:17
test10.BAT:18
test10.BAT:19
test10.BAT:20
test10.BAT:21
test2.BAT:1
test2.BAT:2
test2.BAT:3
test2.BAT:4
test2.BAT:5
test2.BAT:6
test2.BAT:7
test2.BAT:8
test2.BAT:9
test2.BAT:10
test2.BAT:11
test2.BAT:12
test2.BAT:13
test2.BAT:14
test2.BAT:15
test2.BAT:16
test2.BAT:17
test2.BAT:18
test2.BAT:19
test2.BAT:20
test2.BAT:21
test2.BAT:22
test2.BAT:23
test2.BAT:24
test2.BAT:25
test3.BAT:1
test3.BAT:2
test3.BAT:3
test3.BAT:4
test3.BAT:5
test3.BAT:6
test3.BAT:7
test3.BAT:8
test3.BAT:9
test3.BAT:10
test3.BAT:11
test3.BAT:12
test3.BAT:13
test3.BAT:14
test3.BAT:15
test3.BAT:16
test3.BAT:17
test3.BAT:18
test3.BAT:19
test3.BAT:20
test3.BAT:21
test4.BAT:1
test4.BAT:2
test4.BAT:3
test4.BAT:4
test4.BAT:5
test4.BAT:6
test4.BAT:7
test4.BAT:8
test4.BAT:9
test4.BAT:10
test4.BAT:11
test4.BAT:12
test4.BAT:13
test4.BAT:14
test4.BAT:15
test4.BAT:16
test4.BAT:17
test4.BAT:18
test4.BAT:19
test4.BAT:20
test4.BAT:21
test4.BAT:22
test5.BAT:1
test5.BAT:2
test5.BAT:3
test5.BAT:4
test5.BAT:5
test5.BAT:6
test5.BAT:7
test5.BAT:8
test5.BAT:9
test5.BAT:10
test5.BAT:11
test5.BAT:12
test5.BAT:13
test5.BAT:14
test5.BAT:15
test5.BAT:16
test5.BAT:17
test5.BAT:18
test5.BAT:19
test5.BAT:20
test5.BAT:21
test7.bat:1
test7.bat:2
test7.bat:3
test7.bat:4
test7.bat:5
test7.bat:6
test7.bat:7
test7.bat:8
test7.bat:9
test7.bat:10
test7.bat:11
test7.bat:12
test7.bat:13
test7.bat:14
test7.bat:15
test7.bat:16
test7.bat:17
test7.bat:18
test7.bat:19
test7.bat:20
test8.bat:1
test8.bat:2
test8.bat:3
test8.bat:4
test8.bat:5
test8.bat:6
test8.bat:7
test8.bat:8
test8.bat:9
test8.bat:10
test8.bat:11
test8.bat:12
test8.bat:13
test8.bat:14
test8.bat:15
test8.bat:16
test8.bat:17
test8.bat:18
test8.bat:19
test8.bat:20
test8.bat:21
test8.bat:22
test9.BAT:1
test9.BAT:2
test9.BAT:3
test9.BAT:4
test9.BAT:5
test9.BAT:6
test9.BAT:7
test9.BAT:8
test9.BAT:9
test9.BAT:10
test9.BAT:11
test9.BAT:12
test9.BAT:13
test9.BAT:14
test9.BAT:15
test9.BAT:16
test9.BAT:17
test9.BAT:18
test9.BAT:19
test9.BAT:20
test9.BAT:21
test9.BAT:22
Die Ausgabe des Inhalts der Variable %%g muss also außerhalb der zweiten Schleife passieren, sprich in der ersten Schleife.
So zum Beispiel(Was aber auch nicht funktioniert):
For /f "delims=" %%i in (%dateinamen%) do echo %%i & (For /f "delims=:" %%g in ('findstr /n .* %ziel%%%i'))& %%i:%%g>>%ausgabe%
LÖSUNG 15.03.2016 um 14:39 Uhr
Hallo Biber nochmal,
ich habe mir mal das Thema "setlocal EnableDelayedExpansion" durchgelesen und das war die Lösung,
Vielen Dank!
ich habe mir mal das Thema "setlocal EnableDelayedExpansion" durchgelesen und das war die Lösung,
Vielen Dank!
LÖSUNG 15.03.2016 um 14:59 Uhr
Hallo JimStar,
es wäre sicher für andere "Suchende" hilfreich, wenn du deine Lösung hier preisgeben würdest.
Gruß
es wäre sicher für andere "Suchende" hilfreich, wenn du deine Lösung hier preisgeben würdest.
Gruß
LÖSUNG 15.03.2016 um 15:15 Uhr
Hallo MrCount,
stimmt, da hast du naürlich Recht!
Hier meine Lösung:
Ich habe in der Zeile 1 das "& setlocal enabledelayedexpansion " hinzugefügt und in der Zeile 17 aus %Counter% -> !Counter! gemacht, sodass er die Variablenaktualisierung nicht erst in der neuen Zeile bemerkt, sondern direkt ( So habe ich es verstanden, korrigiert mich wenn ich mich irre
).
Als Ausgabe bekomme ich dann folgendes:
stimmt, da hast du naürlich Recht!
Hier meine Lösung:
@echo off & setlocal enabledelayedexpansion
set ziel=C:\Users\name\Desktop\Logon-Skript_umschreiben\Daten\
set dateinamen=C:\Users\name\Desktop\Logon-Skript_umschreiben\valid\dateinamen.txt
set ausgabe=C:\Users\name\Desktop\Logon-Skript_umschreiben\valid\ausgabe.txt
del %dateinamen% > nul
del %ausgabe% > nul
pushd %ziel%
dir /B *.bat > %dateinamen%
For /f "delims=" %%i in (%dateinamen%) do echo %%i & (For /f "delims=:" %%g in ('findstr /n .* %ziel%%%i') DO SET Counter=%%g)& echo %%i:!Counter!>>%ausgabe%
pause
Ich habe in der Zeile 1 das "& setlocal enabledelayedexpansion " hinzugefügt und in der Zeile 17 aus %Counter% -> !Counter! gemacht, sodass er die Variablenaktualisierung nicht erst in der neuen Zeile bemerkt, sondern direkt ( So habe ich es verstanden, korrigiert mich wenn ich mich irre
Als Ausgabe bekomme ich dann folgendes:
test.bat:22
test10.BAT:21
test2.BAT:25
test3.BAT:21
test4.BAT:22
test5.BAT:21
test7.bat:20
test8.bat:22
test9.BAT:22
LÖSUNG 15.03.2016 um 15:32 Uhr
Danke!
