ninced
Goto Top

(BATCH:) Zeilenweise Txt auslesen und in eine Variable speichern

Hallo Leute,

Ich weiß, es ist ein alter Hut, aber ich habe da ein paar Fragen bezüglich der for-Schleife und dem zeilenweise txt auslesen.

Bezug: EINE Zeile aus TXT-Datei auslesen

Leider funktioniert der Code bei mir nicht für Zeile eins. Habe daraufhin auf n-te Zeile in %var% speichern zurückgegriffen (findet ihr nochmals unten). Jetzt habe ich eine Frage: Gibt es ne Möglichkeit direkt in eine Variable zu speichern, ohne den Zwischensprung in :setvarFixLine? Wenn ja wie?

Es geht mir im Speziellem darum, dass ich in eine txt Datei sowas in der Art aufbauen möchte:
main:
F:\Programme\Temp

Test1:
F:\Programme\Temp\T1

Test2:
F:\Programme\Temp\T2

Diese Pfade werden aus einer Variable übergeben, die der User vorher mit set /p setzt. Jetzt möchte ich beim Starten schauen, ob es eine Textdatei mit dem Namen Version.txt gibt und wenn ja, dass dann NUR die Pfade aus der txt genommen werden und in eine Variable, z.B. %variable% übergeben werden. Könnte jemand mir vielleicht :setvarFixLine erklären, da ich da nicht so ganz durchblicke.

Auch wenn ich den Code für die n-te Zeile weiter verschachtel, erkennt er die Variable plötzlich nicht mehr und gibt mir "" aus.

IF exist Test.txt (
    Set /a "cnt=1"   
    Set /a "n=1"   
    for /F "Tokens=*" %%i in (Version.txt) do call :setvarFixLine %n% "%%i"   
    Echo n-te Zeile, n=%n%: %Var%
    pause
    goto :eof


:setvarFixLine 
If %cnt%==%1 Set "Var=%~2"  
echo "%Var%"   
Set /a "cnt+=1"   
goto :eof
pause 

Wäre echt nett, falls jemand für mein Problem Zeit findet und mir da raus hilft. Ich danke schon mal im Voraus,


Ninced


Hier der Code von dem ersten Beitrag:
:: n-te Zeile in %var% speichern; n ist im Beispiel 1
Set /a "cnt=1"   
Set /a "n=1"   
for /F "Tokens=*" %%i in (Version.txt) do call :setvarFixLine %n% "%%i"   
Echo n-te Zeile, n=%n%: %Var%
:: Set var=
pause 
goto :eof 
~~~ 
:setvarFixLine 
If %cnt%==%1 Set "Var=%~2"  
echo "%Var%"   
Set /a "cnt+=1"   
goto :eof
pause 

Content-Key: 269892

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

Printed on: April 24, 2024 at 11:04 o'clock

Member: Ninced
Ninced Apr 22, 2015 at 17:35:44 (UTC)
Goto Top
Habe mal ein bisschen im Forum gesucht... Und das gefunden:

@echo off
for /f "tokens=1,* delims=:" %%i in ('findstr /n  $ Version.txt') do @(  
        for /L %%a in (2,3,8) do @if %%i==%%a @echo %%j
)

Gibt es eine Möglichkeit %%j in jeweils eine Variable zu speichern? Wenn ich statt
echo %%j 
set var=%%j
schreibe, nimmt er das nicht und gibt mir "" aus. Jemand eine Idee?
Member: Endoro
Endoro Apr 23, 2015 updated at 06:48:12 (UTC)
Goto Top
Hey, versuch es mal damit:
@echo off &setlocal disabledelayedexpansion
set "FName=test.txt"  
set "n=1 2 3 8 19"  
for /f "tokens=1*delims==" %%a in ('set . 2^>nul') do set "%%~a="  
for /f "delims=" %%a in ('findstr /n "^" "%FName%"') do (  
	for /f "delims=:" %%b in ("%%~a") do (  
		for %%c in (%n%) do (
			if "%%~b"=="%%~c" (  
				set "line=%%~a"  
				set "nr=0000000000%%~b"  
				setlocal enabledelayedexpansion
				set "line=!line:*:=!"  
				set "nr=!nr:~-10!"  
				set ".!nr!=!line!"  
				for /f "tokens=1*delims==" %%d in ('set .') do (  
					(if "!"=="" endlocal)&set "%%~d=%%~e"  
				)
			)
		)
	)
)

for /f "tokens=1*delims==" %%a in ('set .') do echo(%%~b  
Gruss, Endoro
Member: Ninced
Ninced Apr 23, 2015 at 07:53:43 (UTC)
Goto Top
Hey, danke erstmal für die schnelle Antwort.

Nur gibt er mir von der Textdatei dann die erste, zweite und letzte Zeile aus. Und wie speichere ich die 3 Pfade in variablen ab?

LG,

Ninced
Member: Endoro
Endoro Apr 23, 2015 at 09:56:34 (UTC)
Goto Top
Hey, das ist jeweils die n-te Zeile. Einstellen kannst du das in Zeile 3 vom Skript. Die Namen der Variablen kannst du dir ausgeben lassen, wenn du set . als letzte Zeile anfügst.
Gruß, Endoro
Member: Ninced
Ninced Apr 23, 2015 at 10:10:52 (UTC)
Goto Top
Nur leider macht er das bei mir nicht... Gibt dann immer Syntaxfehler aus. Gehört der Punkt mir dazu? Wenn ja, habe ich es falsch gemacht face-smile
Member: Ninced
Ninced Apr 23, 2015 updated at 13:40:22 (UTC)
Goto Top
Und habe noch ein Problem... habe meine batch in Notepad++ erstellt und dort unter Kodierung auf 858 umgestellt... Jetzt packt er mir in die txt Datei aber die Umlaute nicht mit rein.
Habe schon vor dem Schreiben der txt Datei die Codepage auf 1250 mittels chcp umgestellt. Kein Effekt... Seltsamerweise geht es, wenn ich auf chcp 28591 wechsle, dann verschleiert aber das Command Window die Umlaute.

Jemand dazu ne Idee?

Danke schon mal im Voraus ;)
Member: Endoro
Endoro Apr 23, 2015 at 14:24:06 (UTC)
Goto Top
Hey,
natürlich gehört der Punkt mit dazu sonst wär er nicht da face-smile
Beim Schreiben in eine Datei muss die "Codepage" temporär auf 1252 eingestellt werden und abschließend wieder auf 850 oder was auch immer vorher war.

Gruß, Endoro
Member: Ninced
Ninced Apr 23, 2015 at 14:34:22 (UTC)
Goto Top
Mhh genau das ist das Problem, mache ich, tut er aber nicht... Werde wohl noch mal die Stelle überprüfen... Und das mit dem Punkt werde ich mal probieren
Member: Ninced
Ninced Apr 23, 2015 updated at 19:44:03 (UTC)
Goto Top
Ich habe mir deinen Code noch mal angeschaut. An sich ist er echt gut. Nur wie kann ich die Ausgabe vergleichen... Habe 3 Variablen, die mit Inhalt unter der "Überschrift" gefüllt werden müssen.

main:
F:\Programme\Temp

Test1:
F:\Programme\Temp\T1

Test2:
F:\Programme\Temp\T2

Er soll schauen, ob meine gesetze Variable =="main: " ist und dann die Zeile darunter (hier F:\Programme\Temp) als Variable folder setzen. Das selbe Spiel dann mit Test1 und Test2.
Hier mal mein Ende vom Codeschnipsel. Der Rest steht oben. Konnte das mit dem . nicht machen. Hat mir immer gesagt "Umgebungsvariable nicht gesetzt."
Wäre nett, wenn du mir da noch mal aushelfen könntest.

Danke. (Ich weiß, dass der unten genannte Code immer nur die aktuelle Variable nimmt. Hilfe noch mal gesucht ;) )

	)

)
for /f "tokens=1*delims==" %%a in ('set .') do set "var=%%~b"  

if "%var%"=="main: " (  
  set /a n+=1
  set "folder=%var%"  
)
if "%var%"=="Test1: " (  
   set "Ort1=%var%"   
)
if"%var%"=="Test2: " (  
   set "Ort2=%var%"   
)
  
pause
Member: Endoro
Endoro Apr 26, 2015 at 14:18:46 (UTC)
Goto Top
Hey, da lag ein Mißverständnis vor face-smile
Versuchs mal so:
@echo off &setlocal disabledelayedexpansion
set "FName=test.txt"  
for /f "usebackq" %%a in ("%FName%") do (  
	if defined Fmain set "main=%%~a" &set "Fmain="  
	if defined Ftest1 set "test1=%%~a" &set "Ftest1="  
	if defined Ftest2 set "test2=%%~a" &set "Ftest2="  
	if /i "%%~a"=="main:" set "Fmain=True"  
	if /i "%%~a"=="Test1:" set "Ftest1=True"  
	if /i "%%~a"=="Test2:" set "Ftest2=True"  
)
echo main: "%main%"  
echo test1 "%test1%"  
echo test2 "%test2%"  
Gruß, Endoro
Member: Ninced
Ninced Apr 26, 2015 updated at 15:01:11 (UTC)
Goto Top
Werde ich. Mir ist eine kleine Sache aufgefallen. Mein Code läuft unter Windows 7 einwandfrei. Wenn ich ihn aber unter Windows 8 ausführe meckert er immer in den If Sätzen die bei mir die Pfade in die txt schreiben.

Das seltsame daran ist, dass die If Sätze so aufgebaut sind wie die davor, wo er ohne Probleme durchgeht. Er meckert immer wegen synthetisch falsch bzw. \Test 1 ist kein Befehl.

Unter Windows 7 keine Probleme. Wie ist das möglich?

Hier mal der relevante Code:

@echo off
:startup
echo "Bitte Ordner VOR Test angeben"  
set /p "folder="   
echo;
echo =====================================================
echo;
CHOICE /n /c "34" /M "Welche Version willst du starten? 3 oder 4?"   
IF ERRORLEVEL 2 ( 
   set "c=2"   
   echo; 
   echo "Wo liegt die Version 4.0?"   
   set /p "Test2="  
   goto :global
   )
IF ERRORLEVEL 1 ( 
   set "c=1"   
   echo; 
   echo "Wo liegt die Version 3.8.1?"  
   set /p "Test="  
   goto :global
   )
echo;
echo =====================================================

:global
IF "%c%"=="1" set "variable=%Test%"  
IF "%c%"=="2" set "variable=%Test2%"  
set "rend= Test"  
set "adh=%variable%"  
goto :checkforfile

:txtchanger
chcp 1252>nul
>Version.txt echo main: 
>>Version.txt echo %FOLDER%
>>Version.txt echo;

IF "%c%"=="1" (  
   IF "%rend:~-3%"=="%adh:~-3%" (  
   echo Test:>>Version.txt 
   echo %FOLDER%\Test>>Version.txt 
   echo;>>Version.txt
   echo Test 2:>>Version.txt 
   echo %FOLDER%\Test 2>>Version.txt 
   )
   IF "%adh:~-1%"=="1" (  
   echo Test:>>Version.txt 
   echo %FOLDER%\Test>>Version.txt 
   echo;>>Version.txt 
   echo Test 2:>>Version.txt 
   echo %FOLDER%\Test 2>>Version.txt 
   )
   IF "%adh:~-1%"=="2" (  
   echo Test:>>Version.txt 
   echo %FOLDER%\Test>>Version.txt 
   echo;>>Version.txt 
   echo Test:>>Version.txt 
   echo %FOLDER%\Test 1>>Version.txt 
   )
)
IF "%c%"=="2" ( ... ähnlicher Aufbau wie bei =="1")  
   
chcp 858>nul
goto :preend

...

Vorher war mein Code
>>Version.txt echo Test 1


hat er aber auch nicht genommen. Er legt nur von :txtchanger die ersten drei Zeilen an. In die If Sätze geht er anders als bei Windows 7 nicht rein.
Member: Ninced
Ninced Apr 26, 2015 at 15:14:31 (UTC)
Goto Top
Nachtrag zu Deinem Code:

Funktioniert gut, nur leider übernimmt er in den Pfad keine Leerzeichen. Er schneidet bei dem ersten Leerzeichen ab, auch wenn der Pfad in Anführungszeichen steht.
Member: Endoro
Solution Endoro Apr 26, 2015, updated at Apr 27, 2015 at 14:02:20 (UTC)
Goto Top
Ja, stimmt. Dann musst du darauf achten, dass hinter "main:" usw. kein Leerzeichen steht. Sonst kommen noch drei Forschleifen dazu.
@echo off &setlocal disabledelayedexpansion
set "FName=test.txt"  
for /f "usebackqdelim=" %%a in ("%FName%") do (  
	if defined Fmain set "main=%%~a" &set "Fmain="  
	if defined Ftest1 set "test1=%%~a" &set "Ftest1="  
	if defined Ftest2 set "test2=%%~a" &set "Ftest2="  
	if /i "%%~a"=="main:" set "Fmain=True"  
	if /i "%%~a"=="Test1:" set "Ftest1=True"  
	if /i "%%~a"=="Test2:" set "Ftest2=True"  
)
echo main: "%main%"  
echo test1 "%test1%"  
echo test2 "%test2%"  
Gruss, Endoro
Member: Ninced
Ninced Apr 26, 2015 updated at 20:12:44 (UTC)
Goto Top
OK das funktioniert schon mal, vielen vielen Dank.

Weißt du auch, warum er bei Windows 8 mir die TXT Datei nicht anlegt?
Member: Endoro
Solution Endoro Apr 26, 2015, updated at Apr 27, 2015 at 14:02:25 (UTC)
Goto Top
Das ist der geänderte Code, um Leerzeichen einzulesen.

In deinem Code oben springst du in Zeile 31 nach checkforfile, das nirgens definiert ist.
Zeile 44, 51 ... wenn du was in die Datei schreiben willst, geht das so wie du es oben richtig gemacht hast:
>>Version.txt echo  Test 2:
, um sicherzugehen, dass keine ungewollten hängenden Leerzeichen in die Datei geschrieben werden, schreib es so:
>>Version.txt (echo(  Test 2:)
. So wie du es geschrieben hast, landet es in der Standardfehlerausgabe. Versuch es einfach selbst
echo Test 2>>test.txt
und schau, was in test.txt drinsteht (absolut nichts).
Gruß, Endoro

PS: es gilt für die Zeilen 45 und 52, bei den anderen ist ein Doppelpunkt dazwischen.
Member: Ninced
Ninced Apr 26, 2015 updated at 20:41:53 (UTC)
Goto Top
Naja :checkforfile hab ich gerade mal rausgenommen damit der Code nicht zu lang wird. Ich werde es morgen mal testen und mich dann noch mal melden. Hab beide Versionen eigentlich durchgespielt. Mein Problem war eher dass er die 2. If Schleife nicht gestartet hatte. Wenn ich da n Echo "hier" && pause reingemacht habe, dann hat er das schon nicht getan. Aber ich werde mal rumprobieren, da es scheinbar solch einen Fehler nicht geben sollte ;)

Wäre auch echt nett von Dir, wenn du mir einmal deine letzte For-Schleife erklären könntest. Hab mich zwar jetzt schon durch verschiedene Einträge zur For-Schleife durchgekämpft aber verstehen, wie sie vorgeht oder wonach sie sucht, verstehe ich immer noch nicht.
Member: Endoro
Endoro Apr 26, 2015 at 21:54:26 (UTC)
Goto Top
Hey,
du solltest dir ansehen, was du in dem IF Statement prüfst, ob das überhaupt gleich sein kann. ZB so:
echo "%rend:~-3%"  "%adh:~-3%"  
. Zum Tutorial zur Forschleife geht es hier lang.
Gruss, Endoro
Member: Ninced
Ninced Apr 27, 2015 at 08:53:07 (UTC)
Goto Top
Jap das macht er. Die vorherige if schleife in der ich das prüfe, läuft auch durch. Deswegen verstehe ich den Fehler ja auch nicht.

Gruss, Ninced

Und das Tut habe ich auch schon 3x durchgelesen. Verstehe ich trotzdem nicht. Ich kenne nur die FOR-Schleife aus Java heraus und da musste man ja angeben wonach er suchen soll.

Könntest du es mir einfach nur kurz mit Kommentaren versehen?
Member: Endoro
Endoro Apr 27, 2015 at 11:08:24 (UTC)
Goto Top
Hey,
Jap das macht er. Die vorherige if schleife in der ich das prüfe, läuft auch durch. Deswegen verstehe ich den Fehler ja auch nicht.

Wenn ich das nachbaue, sind die beiden Ausdrücke "%rend:~-3%" und "%adh:~-3%" nie gleich. Deshalb solltest du mal darstellen, was deine Variablen vor dem IF enthalten.
echo c: "%c%" test: "%test%" test2: "%test2%" rend: "%rend%" rend-3: "%rend:~-3%" variable: "%variable%" adh: "%adh%" adh-3: "%adh:~-3%"  
Gruß, Endoro
Member: Ninced
Ninced Apr 27, 2015 at 14:02:11 (UTC)
Goto Top
Hab wohl den vermeindichen Fehler gefunden.

Lag wohl an den Adminrechten.
Hab es nicht als Admin ausgeführt, weswegen er immer in den Fehler gelaufen ist.

Trotzdem vielen vielen Dank. Die Batch Datei läuft jetzt ^-^