apop85
Goto Top

Zeilenweise auslesen und in Variablen speichern

Hallo erstmal.
Ich hab schon zig einträge dieser Art hier gefunden und trozdem... bin ich wieder da...

Ich hab das Script von einem anderen Thread hier übernommen und in der Test-Bat funktioniert dies auch Tip Top, nur meine implementierung in das Hauptscript will einfach nicht hinhauen... face-sad

Original:
@echo off
set line=
set /a count=0
FOR /f "delims=" %%f IN ('type "test.txt"') DO call :ProcessLine "%%f"  

exit
:ProcessLine
if %count%==0 goto :NewLine
set /a count+=1
If %count% GTR 1 goto :NewLine
goto :eof
:NewLine
If %count% neq 0 echo %count% - %line% - %workflow%
set "line=%~1"  
set /a count=1
goto :eof

Meine Implementierung:
.
.
.
:LISTUSER
if exist %tmp%\rlh.tmp del %tmp%\rlh.tmp
if not exist %tmp%\userlist.tmp copy NUL %tmp%\userlist.tmp >NUL
if not exist %tmp%\rlh.tmp copy NUL %tmp%\rlh.tmp >NUL

wbat cls (+white on +red) ! text 0 :title #%zpos% +5
wbat text (black on +white) 12,28 "Datenbank wird ausgelesen..."  

set /a counter=0
set zeile=
for /f "delims=" %%f IN ('type "%cd%\user\system.cry"') DO call :WORKFLOW "%%f"  
goto USERLIST

:WORKFLOW
if %counter% == 0 goto WORKFLOW2
set /a counter+=1
if %counter% GTR 1 goto WORKFLOW2
goto :eof

:WORKFLOW2
if defined zeile echo %zeile% >>%tmp%\rlh.tmp
set suchstr=%zeile:~-21%

for /f "tokens=1-2 delims=-" %%i in ('findstr "%suchstr%" "%tmp%\rlh.tmp"') do (  
	set "liID=%%i"  
	set "cryptli=%%j"  
	)

set "zeile=%~1"   
set /a counter=1

set... definitionen für %liname% und %linaname%

rem -- Ausgang für Suche nach einer bestimmten Zeile ----
if "%wbat%" == "%liname% %linaname%" goto USERINFO  
rem ----------------------------------------------------

>>%tmp%\userlist.tmp echo %liname% %linaname% --> Auflistung der gefundenen Zeilen

goto :eof
.
.
.

Er scheint zwar zu erkennen, dass das Dokument nur zwei Zeilen besitzt jedoch habe ich in der Ausgabe schlussendlich zwei gleiche Einträge (der ersten Zeile) in meiner tmp. Daher auch meine Annahme, dass er die Zeilenanzahl richtig erkennt...

Ich seh langsam den Wald vor lauter Bäumen nicht... Ich sehe in den Wesentlichen Befehlen der zwei Scripts keine Unterschiede...

Wo zum Kuckuck hab ich da mist gebaut? ^^

Grüsse Apop

P.S:
Die wbat-Befehle sind aus dem Batch-Utility WBAT

Content-ID: 205033

Url: https://administrator.de/forum/zeilenweise-auslesen-und-in-variablen-speichern-205033.html

Ausgedruckt am: 25.12.2024 um 13:12 Uhr

Endoro
Endoro 16.04.2013 um 10:46:01 Uhr
Goto Top
Hallo Apop85,

ich habe keinerlei Lust mich mit diesem cruden Code auseinander zusetzen! Weiss nicht, ob sonst jemand.

Vielleicht kannst du ja einfach mal dazu sagen, was der machen soll und nicht, wo du ihn gefunden hast.

Ausserdem: wer ist "wbat"? Muss ich den kennen ??


Gruss!
Apop85
Apop85 16.04.2013 um 12:03:00 Uhr
Goto Top
Hey @Endoro, mal wieder ;)
Danke für deine Aktive Unterstützung

Vielleicht kannst du ja einfach mal dazu sagen, was der machen soll und nicht, wo du ihn gefunden hast.
Er soll (ohne VBS, weil bei uns in der Firma nicht drin ) Zeile um Zeile einer datei Auslesen und Inhalte dieser Zeile als Variabel speichern (liname und linaname) danach zu nächsten und so weiter...


Ausserdem: wer ist "wbat"? Muss ich den kennen ??
Batchutility WBAT

Grüsse Apop
Endoro
Endoro 16.04.2013 um 13:03:45 Uhr
Goto Top
Hallo Apop85,

das folgende Programm liest alle Zeilen aus file.txt und speichert die in "var1", "var2" ... "varXX".

@echo off&setlocal 
for /f "tokens=1*delims=:" %%i in ('^< file.txt findstr /n "^"') do set "var%%i=%%j"  


Gruss!
Apop85
Apop85 16.04.2013 um 13:56:29 Uhr
Goto Top
Da hängt er sich auf...

for /f "tokens=1*delims=:" %%i in ('^< test.txt findstr /n "^"') do set "var%%i=%%j"  

Ich weiss ja du willst dich nicht zu sehr in das Geknurze reinlesen aber ich Post trozdem mal meinen Ansatz (CUT-Version -) )

@echo off
setlocal ENABLEDELAYEDEXPANSION
:1
set counter=0
for /f "tokens=1*delims=:" %%i in ('^< test.txt findstr /n "^"') do set "var%%i=%%j"  

:2
set /a counter+=1
set outp=var%counter%
if "!%outp%!" == {{comment_strings:22248342879}} goto :eof    
if "!%outp%!" neq "" echo %zeile%>>rlh.tmp  

set zeile=%zeile:~-21%
for /f "tokens=1-2 delims=-" %%i in ({{comment_strings:22307564654}})   
   ( do set "liID=%%j" & do set "cryptli=%%k" )  
   
set "b1=%cryptli:~13,1%" & set "p1=%cryptli:~18,1%"  

... entschlüsselung in Username und Benutzerrechte...

set {{comment_strings:21276964775}} 
set "linaname=%p1%%p2%%p3%%p4%%p5%%p6%%p7%%p8%"  
set "livis=%v1%%v2%%v3%"  
set "lirights=%r1%%r2%"  

if "%lirights%" == "ad" set {{comment_strings:24189738458}} else set "lirights=User"  
if "%wbat%" == "%liname% %linaname%" goto USERINFO  

>>%tmp%\userlist.tmp echo %liname% %linaname%

goto 2

Diese userlist.tmp verwender ich dann mittels WBAT als Listenanzeige daher das mühsame Entschlüsseln.

Gruss
Endoro
Endoro 16.04.2013 um 14:21:44 Uhr
Goto Top
Zitat von @Apop85:
Da hängt er sich auf...

Ich habe grad mal ohne Probleme eine TXT mit 10.000 Zeilen und 50 Buchstaben / Zeile eingelesen. Wie gross ist deine TXT? Was hast du für ein System?


Gruss!
Apop85
Apop85 16.04.2013 um 15:12:42 Uhr
Goto Top
Wie gross ist deine TXT? Was hast du für ein System?
Winzig bis jetzt ^^. Hab Grad mal 14 Zeilen in der test.txt drin. Da drin steht nur x. Zeile y. Zeile....

Im richtigen File sind die Daten folgendermassen hinterlegt:

00000000-semg3ndhuf1kpaljb2ico - Sind zwei Infos:[ID] - [Username,Rechte]

Aus dem möchte ich die ID und den Rest extrahieren. Den Rest Entschlüssel ich dann zu Name Rechte usw...

gruss.
Endoro
Endoro 16.04.2013 aktualisiert um 15:59:49 Uhr
Goto Top
"userID" und "rest" könnte gleich am Anfang getrennt werden, wenn ein "-" dazwischen ist:

@echo off&setlocal
for /f "tokens=1-3delims=:-" %%i in ('^< file.txt findstr /n "^"') do set "userid%%i=%%j"&set "rest%%i=%%k"& set /a cnt+=1  
for /l %%i in (1,1,%cnt%) do (
	setlocal enabledelayedexpansion
	echo(userID: !userID%%i! Rest: !rest%%i!
	endlocal
)


Gruss!
Apop85
Apop85 18.04.2013 aktualisiert um 03:33:02 Uhr
Goto Top
Ja das geht so face-smile
Habs jetzt meinen Bedürfnissen etwas angepasst aber es will leider noch immer nicht so ganz

for /f "tokens=1-3 delims=:-" %%i in ('^< "%server%\user\system.cry" findstr /n "^"') do set "userid%%i=%%j"&set "rest%%i=%%k"& set /a cnt+=1  
for /l %%i in (1,1,%cnt%) do (
	


set "b1=!rest%%i:~13,1!" & set "p1=!rest%%i:~18,1%!  
usw...

set "name=%b1%%b2%%b3%%b4%%b5%%b6%%b7%%b8%"  
set "nachname=%p1%%p2%%p3%%p4%%p5%%p6%%p7%%p8%"  

set "visum=%v1%%v2%%v3%"  
set "benutzerrechte=%r1%%r2%"  
echo !userID!-!name!-!nachname!-!benutzerrechte!-!visum! >>%tmp%\user.lis 
)
Ich hab dann pro Zeile die existiert einen Eintrag der ersten Zeile.
Also wenn Zeile 1 z.B. 00000000000-abcdefghijkl ist und Zeile 2 111111111111-mnopqrstuvw
dann hab ich in der user.lis zwei mal 00000000000-acefhjlbegik drin...bei vier Einträgen vier mal usw...
Die decodierung funktioniert soweit. Nur eben dass er nur immer das selbe decodiert.

Gruss Apop
Endoro
Endoro 18.04.2013 aktualisiert um 09:13:33 Uhr
Goto Top
Hallo Apop85,

wenn sich in Batch was überraschend nicht ändert was es eigentlich sollte liegt es meistens an der fehlenden verzögerten Erweiterung. Die muss aber vorsichtig benutzt werden, weil sie Ausrufungszeichen und Carets in Variablen rückstandsfrei entfernt. Allerdings nicht rückwirkend, weshalb ich sie in Forschleifen an- und ausschalte.

Beispiel für das Wirken der verzögerten Erweiterung:
@echo off &setlocal 
set "string1=a!!^^ ^^ b"  
echo string1: "%string1%"  
setlocal enabledelayedexpansion
echo string1: "!string1!" ^<--- alles noch da^^!  
set "string2=%string1%"  
echo string2: "%string2%" "!string2!"  
set "string3=!string1!"  
echo string3: "%string3%" "!string3!"  

Output:
string1: "a!!^^ ^^ b"
string1: "a!!^^ ^^ b" <--- alles noch da!
string2: "a  b" "a^ ^ b"
string3: "astring3"


Gruss!
Apop85
Apop85 18.04.2013 aktualisiert um 17:11:38 Uhr
Goto Top
Hey Endoro. Jupp hattest recht musste noch etwas mit den Verzögerungen basteln und nun funktioniert es so wie ich will... Nur Zeile 11 will noch nicht. Da habe ich einen Ausgang falls in einem Menü ein bestimmter Name angewählt wurde. da geht er mir nicht aus enabledelayedexpansion raus... musste dann halt noch bei :USERINFO ein setlocal disabledelayedexpansion reinschreiben...
for /f "tokens=1-3 delims=:-" %%i in ('^< "%server%\user\system.cry" findstr /n "^"') do set "userid%%i=%%j"&set "rest%%i=%%k"& set /a cnt+=1  
for /l %%i in (1,1,%cnt%) do (

setlocal enabledelayedexpansion

set "b1=!rest%%i:~13,1!" & set "p1=!rest%%i:~18,1!"  
blablabla usw...
set "lirights=!r1!!r2!"  
set "liID=!userID%%i!"  
echo !liname!-!linaname! >>%tmp%\user.lis 
if "%wbat%" == "!liname!-!linaname!" endlocal & goto USERINFO  
endlocal
)

Danke für deine Hilfe
Apop85
Apop85 18.04.2013 um 20:41:11 Uhr
Goto Top
Habs nun lösen können indem ich endlocal nicht verwendet habe sondern einfach das delayedexpansions wieder ausgeschaltet habe. Mit dem endlocal hat er mir ja die Variablen gelöscht bevor ich sie Anzeige face-smile

Ich danke dir für deine Hilfe

Liebe Grüsse Apop