kangaroojack
Goto Top

2 Dateien Zeilenweise auslesen und werte in einer Zeile ausgeben

Hallo Leute,

ich möchte aus 2 Textdateien jeweils eine Zeile auslesen und zusammen ausgeben.
Hintergrund:
mit "net user Benutzername Passwort" ändert man das Passwort eines Benutzers
nun habe ich eine Liste benutzernamen.txt:

hugo
egon
hans
...

und eine Liste Passwörter:

0815_df
35745kg/%
jdgjjdg83;_

nun möchte ich ziele 1 aus datei 1 und zeile 1 aus datei 2 lesen und mit dem befehl net user zusammen ausgeben z.B.:

net user hugo 0815_df

Bisher habe ich das hier entwickelt:
@echo off & setlocal enabledelayedexpansion
for /L %%n in (1,1,1) do (
FOR /F %%i IN (C:\Migration\_scharf\homelaufwerke.txt) do set test=%%i & FOR /F %%i IN (C:\Migration\_scharf\passwortliste.txt) do set test2=%%i & echo !test! !test2!
)

aber das liefert:

hugo 0815_df
hugo 35745kg/%
hugo jdgjjdg83;_
...

und geht dann über zum nächsten Benutzernamen

Kann mir da jemand weiterhelfen.

Danke im Voraus!

Content-Key: 168469

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

Printed on: April 18, 2024 at 14:04 o'clock

Member: Friemler
Friemler Jun 22, 2011 at 10:25:42 (UTC)
Goto Top
Hallo Kangaroojack,

das könnte so gehen:
@echo off

setlocal


set "UserFile=benutzer.txt"  
set "PWFile=passwort.txt"  


for /f "usebackq delims=" %%l in ("%UserFile%") do (  
  set "Item="%%l""  
  call :ConcatString User
)

for /f "usebackq delims=" %%l in ("%PWFile%") do (  
  set "Item=%%l"  
  call :ConcatString Passwords
)


set /a Idx=1

for %%u in (%User%) do (
  call :ProcessUser
  set /a Idx+=1
)

exit /b



:ProcessUser
  for /f "tokens=%Idx%" %%p in ("%Passwords%") do (  
    echo %%~u %%p
  )
exit /b



:ConcatString
  call set "%1=%%%1%% %%Item%%"  
exit /b
Benutzer und Passwörter werden zuerst in Variablen eingelesen (Zeilen 10 bis 18). Die einzelnen Werte in User sind in Anführungszeichen eingeschlossen und durch Leerzeichen voneinander getrennt. Die Werte in Passwords sind nicht durch Anführungszeichen eingeschlossen und dürfen keine Leerzeichen enthalten.

Das eigentliche zusammenfügen der Einzelwerte wird im Unterprogramm ConcatString erledigt, dass den Namen der Variablen, die zusammengesetzt werden soll, als Parameter erwartet.

Ab Zeile 23 wird die Variable User ausgelesen und nach jedem Benutzernamen ein Zähler erhöht. Dieser Zähler wird im Unterprogramm ProcessUser als Index in die Liste der Passwörter in der Variablen Passwords benutzt und der zugehörige Wert ausgelesen.

In Zeile 34 erfolgt die Ausgabe. Die Laufvariable %%u stammt aus der FOR-Schleife in den Zeilen 23 bis 26, kann in der FOR-Schleife des Unterprogramms aber benutzt werden.

Gruß
Friemler


[EDIT]
Code geändert, sodass auch Ausrufezeichen in den Passwörtern/Benutzernamen enthalten sein können.
[/EDIT]
Member: Skyemugen
Skyemugen Jun 22, 2011 at 10:38:29 (UTC)
Goto Top
Zitat von @Kangaroojack:
35745kg/%


... was beim Bätscheln damit wohl passieren wird ...
Member: Friemler
Friemler Jun 22, 2011 at 10:43:49 (UTC)
Goto Top
Moin Skeymugen,

das wird ausgegeben. face-smile

Probleme machen nur Leerzeichen und Ausrufezeichen.

Gruß
Friemler
Member: Skyemugen
Skyemugen Jun 22, 2011 at 10:45:14 (UTC)
Goto Top
Aloha Friemler,

... warum zweifle ich daran, dass ein einzelnes Prozentzeichen ausgegeben wird?

greetz André
Member: Friemler
Friemler Jun 22, 2011 at 10:47:50 (UTC)
Goto Top
Weil Du es nicht getestet hast. face-wink

Im Ernst: Wenn man mit ECHO Laufvariablen von FOR-Schleifen ausgibt, spielen Sonderzeichen keine Rolle.

Gruß
Member: Skyemugen
Skyemugen Jun 22, 2011 at 11:00:14 (UTC)
Goto Top
Aloha,

hm ...

egon 35745kg/
...

gut, das zwar aus einem nur halbfunktionierendem Skript aber nichtsdestotrotz aus einem ECHO einer Laufvariable der FOR-Schleife ...

hm ... na gut, dann muss ich wohl nochmal gucken, wo genau der Unterschied zwischen unseren Skripten liegt *grübel*


edit: nvm hab die Ursache schon gefunden *gg* habe natürlich mit Unterprogramm gearbeitet (ohne EDE) für die beiden Schleifen (als eine Befehlszeile) und deren Laufvariablen ^_^ und da mag er dann das Zeichen nicht mit ausgeben
Member: Friemler
Friemler Jun 22, 2011 at 11:07:16 (UTC)
Goto Top
Hi,

die Daten müssen aus einer Datei stammen oder z.B. aus der Ausgabe eines DIR-Befehls. Wenn Du einer Variablen Sonderzeichen zuweist und diese Variable über eine FOR-Schleife ausgeben willst, funktioniert es nicht - die Zuweisung ist dann das Problem.

Gruß
Friemler


[EDIT]]
Ah, hat sich wohl erledigt.
[/EDIT]
Member: Kangaroojack
Kangaroojack Jun 22, 2011 at 13:21:12 (UTC)
Goto Top
@ Friemler!

Super vielen Dank!!!

Da hab ich mir schon Stunden lang die Finger wundgetippt und wäre wohl nie dahinter gekommen...habs net so mit dem coden face-smile

Danke!
Member: Friemler
Friemler Jun 22, 2011 at 13:24:07 (UTC)
Goto Top
@Kangaroojack

Gern geschehen.

Wenn das Problem damit gelöst ist, setze doch bitte noch den Beitrag auf gelöst.

Gruß
Friemler
Member: jeb-the-batcher
jeb-the-batcher Jun 22, 2011 at 16:46:08 (UTC)
Goto Top
Zitat von @Friemler:
Im Ernst: Wenn man mit ECHO Laufvariablen von FOR-Schleifen ausgibt, spielen Sonderzeichen keine Rolle.

Zitat von @Friemler:
die Daten müssen aus einer Datei stammen oder z.B. aus der Ausgabe eines DIR-Befehls. Wenn Du einer Variablen
Sonderzeichen zuweist und diese Variable über eine FOR-Schleife ausgeben willst, funktioniert es nicht - die Zuweisung
ist dann das Problem.

Fast richtig.
Wenn man Variablen mit Ausrufezeichen expandiert spielen Sonderzeichen absolut keine Rolle.
Wenn man die FOR-Loop-Variabeln ausgibt spielen nur noch ! und teilweise auch ^ eine Rolle, aber nur wenn delayed expansion aktiv ist, ansonsten sind auch die FOR-Loop-Variabeln absolut sicher, egal ob bei echo Ausgaben oder set Zuweisungen.

Wenn Du einer Variablen Sonderzeichen zuweist und diese Variable über eine FOR-Schleife ausgeben willst, ....
Ja dann geht das schon.
setlocal EnableDelayedExpansion
set "variable=%%^!&<>"  
FOR /F "delims=" %%a in (!variable!) DO (  
  setlocal DisableDelayedExpansion
  echo %%a
  endlocal
)

Prozentzeichen machen übrigens nie ein Problem, wenn sie erst mal als Inhalt in einer Variablen sind, allerdings ist es halt schwieriger/anders sie erst mal hinein zu bekommen. Statt mit ^ können sie nur mit %% escaped werden.

jeb
Member: Friemler
Friemler Jun 22, 2011 at 17:16:36 (UTC)
Goto Top
Hallo Jeb,

Zitat von @jeb-the-batcher:
Wenn man Variablen mit Ausrufezeichen expandiert spielen Sonderzeichen absolut keine Rolle.
Du widersprichst Dir: face-wink
Zitat von @jeb-the-batcher:
Wenn man die FOR-Loop-Variabeln ausgibt spielen nur noch ! und teilweise auch ^ eine Rolle, aber nur wenn delayed expansion aktiv ist
Das gilt auch für normale Variablen.

Zitat von @jeb-the-batcher:
ansonsten sind auch die FOR-Loop-Variabeln absolut sicher, egal ob bei echo Ausgaben oder set Zuweisungen.
Genau. Deshalb vermeide ich DelayedExpansion wo es nur geht.

Zitat von @jeb-the-batcher:
Wenn Du einer Variablen Sonderzeichen zuweist und diese Variable über eine FOR-Schleife ausgeben willst, ....
Ja dann geht das schon.
...
Prozentzeichen machen übrigens nie ein Problem, wenn sie erst mal als Inhalt in einer Variablen sind, allerdings ist es halt
schwieriger/anders sie erst mal hinein zu bekommen. Statt mit ^ können sie nur mit %% escaped werden.
Diese Escape-Geschichten waren mir schon bekannt, aber Mitleser wissen es jetzt auch.


Allgemein kann man aber schon sagen: Wenn z.B. der Inhalt von beliebigen Dateien verarbeitet werden soll oder beliebig gestaltete Dateinamen, nimmt man besser VBS. Ich habe mal eine Dateiauswahlbox für die Konsole in Batchscript geschrieben (Spielerei von ca. 1300 Zeilen face-wink ), die beliebig aufgebaute Dateinamen anzeigen kann, aber es war ein ziemlicher Krampf, das hinzubekommen. Dieser ganze CMD-Parser ist eben ein Praktikanten-Werk.


Gruß
Friemler
Member: jeb-the-batcher
jeb-the-batcher Jun 22, 2011 at 19:13:08 (UTC)
Goto Top
Hallo Friemler,

Zitat von @Friemler:
> Zitat von @jeb-the-batcher:
> ----
> Wenn man Variablen mit Ausrufezeichen expandiert spielen Sonderzeichen absolut keine Rolle.
Du widersprichst Dir: face-wink
> Zitat von @jeb-the-batcher:
> ----
> Wenn man die FOR-Loop-Variabeln ausgibt spielen nur noch ! und teilweise auch ^ eine Rolle, aber nur wenn delayed expansion
aktiv ist
Das gilt auch für normale Variablen.

Hmm, entweder verstehe ich dich nicht oder ich verstehe mich nicht face-smile

Aber einen Widerspruch sehe ich hier nicht.
@echo off
setlocal DisableDelayedExpansion
set "test=Ein Dach ^ mit Inhalt!"  
echo Der echte Inhalt mit SET
set test
echo(
echo DDE-prozent     = %test%
for /F "delims=" %%a in ("%test%") do  echo DDE-Prozent-FOR = %%a  
setlocal EnableDelayedExpansion
echo(
echo EDE-prozent     = %test%
echo EDE-Ausrufez.   = !test!
for /F "delims=" %%a in ("%test%") do  echo EDE-Prozent-FOR = %%a  
for /F "delims=" %%a in ("!test!") do  echo EDE-Ausrufe-FOR = %%a  
for /F "delims=" %%a in ("!test!") do  (  
	setlocal DisableDelayedExpansion
	echo EDE-Toggle-FOR  = %%a
	endlocal
)

Der echte Inhalt mit SET
test=Ein Dach ^ mit Inhalt!

DDE-prozent     = Ein Dach  mit Inhalt!
DDE-Prozent-FOR = Ein Dach ^ mit Inhalt!

EDE-prozent     = Ein Dach  mit Inhalt
EDE-Ausrufez.   = Ein Dach ^ mit Inhalt!
EDE-Prozent-FOR = Ein Dach  mit Inhalt
EDE-Ausrufe-FOR = Ein Dach  mit Inhalt
EDE-Toggle-FOR  = Ein Dach ^ mit Inhalt!

Womit doch gezeigt ist, dass nach der Expansion mit !test! eben keine weitere Sonderzeichen ausgewertet werden

jeb
Member: Kangaroojack
Kangaroojack Feb 24, 2012 at 16:49:51 (UTC)
Goto Top
Hallo Leute,

das Skript von Friemler hat wohl irgendwie noch einen Fehler.
Wir hatten eine Umstellung - diesmal mit ca 50 Usern und ich habe mich gewundert, dass nur bei ca. der hälfte der User erfolgreich das PW geändert wurde. Zuerst dachte ich an eine Limitierung, dass man nur XX Passworte in bestimmter Zeit ändern kann, dem ist aber nicht so. Es liegt an dem Skript - es bastelt Benutzername und PW nur bis Position 31 zusammen und endet dann. (Setzt man idx=0, wird noch bis 32 gezählt, aber das wars dann.

Setzt man IDX >= 32 macht das Skript garnichts.

Hab eben mal 2 Testdateien mit 250 Usernamen und eine mit 250 PW´s erstellt und damit getestet - bei 31 bzw.32 ist Feierabend.

Könnt ihr mir weiterhelfen?

Vielen Dank
Member: Skyemugen
Skyemugen Feb 24, 2012 at 18:00:14 (UTC)
Goto Top
BOING, maximale Anzahl an Tokens erreicht, leider bin ich gleich weg, die Lösung gibt es unelegant z.B.
dort, sodass man alles >31 auslagert und wieder 1-31 hat etc.

naja, kann es jetzt nicht eben umbauen, kannst ja mal selbst testen face-wink

greetz André
Member: Kangaroojack
Kangaroojack Feb 25, 2012 at 00:30:03 (UTC)
Goto Top
Super, danke für den Hinweis.

Konnte damit zwar wenig anfangen, konnte mich aber nach einer anderen Lösung umsehen.
Hab #282369 hier eine Lösung von Bastla für mich gefunden, die ich etwas umbauen konnte. Funktioniert jetzt auch Problemlos mit 250++ Usern.

Anbei mein abgeänderter Code:

@echo off & setlocal
set "L1=C:\Temp\User.txt"  
set "L2=C:\Temp\PW.txt"  
set "oklog=C:\Temp\pwokLog.txt"  
set "errorlog=C:\Temp\pwerrorLog.txt"  
if exist "%oklog%" del "%oklog%"  
if exist "%errorlog%" del "%errorlog%"  
for /f "usebackq tokens=1" %%a in ("%L1%") do (  
	set "Line1=%%a" & call :ProcessLine  
)
start %errorlog%
start %oklog%
goto :eof

:ProcessLine
for /f "tokens=1,* delims=:" %%b in ('findstr /n . "%L2%"^') do set "Line2=%%c"  
	echo Passwort fuer Benutzer "%Line1%" wird auf "%Line2%" gesetzt  
	net user %Line1% %Line2%>nul 
	if errorlevel 1 goto :fehler
	if errorlevel 0 goto :ok
goto :eof

:fehler
echo FEHLER beim setzen von Passwort fuer Benutzer "%Line1%">>"%errorlog%"  
goto :eof

:ok
echo Passwort fuer Benutzer "%Line1%" wurde erfolgreich auf "%Line2%" gesetzt>>"%oklog%"   
goto :eof

:eof
Member: bastla
bastla Feb 25, 2012 at 01:25:01 (UTC)
Goto Top
Hallo Kangaroojack!

Das ließe sich noch etwas straffen:
@echo off & setlocal
set "L1=C:\Temp\User.txt"  
set "L2=C:\Temp\PW.txt"  
set "oklog=C:\Temp\pwokLog.txt"  
set "errorlog=C:\Temp\pwerrorLog.txt"  
if exist "%oklog%" del "%oklog%"  
if exist "%errorlog%" del "%errorlog%"  
for /f "usebackq tokens=1" %%a in ("%L1%") do (  
	set "Line1=%%a" & call :ProcessLine  
)
start %errorlog%
start %oklog%
goto :eof

:ProcessLine
for /f "tokens=1,* delims=:" %%b in ('findstr /n . "%L2%"') do set "Line2=%%c"  
echo Passwort fuer Benutzer "%Line1%" wird auf "%Line2%" gesetzt  
net user %Line1% %Line2%>nul && (
    echo Passwort fuer Benutzer "%Line1%" wurde erfolgreich auf "%Line2%" gesetzt>>"%oklog%"   
) || (
    echo FEHLER beim setzen von Passwort fuer Benutzer "%Line1%">>"%errorlog%"  
)
goto :eof
Ein
if errorlevel 0 ...
ist witzlos, da damit auf Errorlevel >= 0 geprüft wird, und eine Sprungmarke ":eof" unnötig, da der Interpreter dafür automatisch "Ende" (des Unterprogramms oder des Batches) einsetzt (insofern könnte auch die letzte Zeile entfallen - ich schreibe sie eigentlich immer nur für den Fall dazu, dass ev - nach einer Sprungmarke - noch weitere Batchzeilen angefügt würden) ...

Grüße
bastla
Member: Kangaroojack
Kangaroojack Feb 25, 2012 at 12:57:30 (UTC)
Goto Top
Hey bastla,

hab das Skript so übernommen. Vielen Dank für die Überarbeitung!
Manchmal wünsche ich mir echt mehr Zeit für die Batch zu haben um fitter zu werden...aber der Beruf ist halt so vielseitig, da kann man nicht alles können.

Schön, dass man hier so tolle Unterstützung bekommt!
Nochmals vielen Dank.

Gruß
KangarooJack