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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 168469
Url: https://administrator.de/contentid/168469
Ausgedruckt am: 25.11.2024 um 10:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo Kangaroojack,
das könnte so gehen:
Benutzer und Passwörter werden zuerst in Variablen eingelesen (Zeilen 10 bis 18). Die einzelnen Werte in
Das eigentliche zusammenfügen der Einzelwerte wird im Unterprogramm
Ab Zeile 23 wird die Variable
In Zeile 34 erfolgt die Ausgabe. Die Laufvariable
Gruß
Friemler
[EDIT]
Code geändert, sodass auch Ausrufezeichen in den Passwörtern/Benutzernamen enthalten sein können.
[/EDIT]
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
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]
Aloha,
hm ...
...
gut, das zwar aus einem nur halbfunktionierendem Skript aber nichtsdestotrotz aus einem
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
hm ...
egon 35745kg/
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
Hi,
die Daten müssen aus einer Datei stammen oder z.B. aus der Ausgabe eines
Gruß
Friemler
[EDIT]]
Ah, hat sich wohl erledigt.
[/EDIT]
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]
@Kangaroojack
Gern geschehen.
Wenn das Problem damit gelöst ist, setze doch bitte noch den Beitrag auf gelöst.
Gruß
Friemler
Gern geschehen.
Wenn das Problem damit gelöst ist, setze doch bitte noch den Beitrag auf gelöst.
Gruß
Friemler
Zitat von @Friemler:
Im Ernst: Wenn man mit ECHO Laufvariablen von FOR-Schleifen ausgibt, spielen Sonderzeichen keine Rolle.
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
Sonderzeichen zuweist und diese Variable über eine
ist dann das Problem.
die Daten müssen aus einer Datei stammen oder z.B. aus der Ausgabe eines
DIR
-Befehls. Wenn Du einer VariablenSonderzeichen zuweist und diese Variable über eine
FOR
-Schleife ausgeben willst, funktioniert es nicht - die Zuweisungist 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
Hallo Jeb,
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 ), 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
Zitat von @jeb-the-batcher:
Wenn man Variablen mit Ausrufezeichen expandiert spielen Sonderzeichen absolut keine Rolle.
Du widersprichst Dir: Wenn man Variablen mit Ausrufezeichen expandiert spielen Sonderzeichen absolut keine Rolle.
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.Wenn man die FOR-Loop-Variabeln ausgibt spielen nur noch ! und teilweise auch ^ eine Rolle, aber nur wenn delayed expansion aktiv ist
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.ansonsten sind auch die FOR-Loop-Variabeln absolut sicher, egal ob bei echo Ausgaben oder set Zuweisungen.
Zitat von @jeb-the-batcher:
Wenn Du einer Variablen Sonderzeichen zuweist und diese Variable über eine
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.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.
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 ), 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
Hallo Friemler,
Hmm, entweder verstehe ich dich nicht oder ich verstehe mich nicht
Aber einen Widerspruch sehe ich hier nicht.
Womit doch gezeigt ist, dass nach der Expansion mit !test! eben keine weitere Sonderzeichen ausgewertet werden
jeb
Zitat von @Friemler:
> Zitat von @jeb-the-batcher:
> ----
> Wenn man Variablen mit Ausrufezeichen expandiert spielen Sonderzeichen absolut keine Rolle.
Du widersprichst Dir:
> 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:
> ----
> Wenn man Variablen mit Ausrufezeichen expandiert spielen Sonderzeichen absolut keine Rolle.
Du widersprichst Dir:
> 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
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
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
greetz André
dort, sodass man alles >31 auslagert und wieder 1-31 hat etc.
naja, kann es jetzt nicht eben umbauen, kannst ja mal selbst testen
greetz André
Hallo Kangaroojack!
Das ließe sich noch etwas straffen:
Ein
ist witzlos, da damit auf Errorlevel >= 0 geprüft wird, und eine Sprungmarke "
Grüße
bastla
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
if errorlevel 0 ...
: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