jimstar
Goto Top

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:

 
@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: 
-> 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 face-smile

Gruß

Content-ID: 299155

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

Ausgedruckt am: 26.11.2024 um 16:11 Uhr

Biber
Biber 15.03.2016 aktualisiert um 14:49:32 Uhr
Goto Top
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
...
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
JimStar
JimStar 15.03.2016 um 14:19:45 Uhr
Goto Top
Hallo Biber,

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%  
JimStar
JimStar 15.03.2016 um 14:39:45 Uhr
Goto Top
Hallo Biber nochmal,

ich habe mir mal das Thema "setlocal EnableDelayedExpansion" durchgelesen und das war die Lösung,

Vielen Dank!
MrCount
MrCount 15.03.2016 um 14:59:26 Uhr
Goto Top
Hallo JimStar,

es wäre sicher für andere "Suchende" hilfreich, wenn du deine Lösung hier preisgeben würdest. face-big-smile

Gruß
JimStar
JimStar 15.03.2016 um 15:15:57 Uhr
Goto Top
Hallo MrCount,

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 face-smile ).

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 
MrCount
MrCount 15.03.2016 um 15:32:27 Uhr
Goto Top
Danke! face-big-smile face-smile