Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

2 Dateien Zeilenweise auslesen und werte in einer Zeile ausgeben

Frage Entwicklung Batch & Shell

Mitglied: Kangaroojack

Kangaroojack (Level 1) - Jetzt verbinden

22.06.2011, aktualisiert 24.02.2012, 4500 Aufrufe, 17 Kommentare

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!
Mitglied: Friemler
22.06.2011 um 12:25 Uhr
Hallo Kangaroojack,

das könnte so gehen:
01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
 
06.
set "UserFile=benutzer.txt" 
07.
set "PWFile=passwort.txt" 
08.
 
09.
 
10.
for /f "usebackq delims=" %%l in ("%UserFile%") do ( 
11.
  set "Item="%%l"" 
12.
  call :ConcatString User 
13.
14.
 
15.
for /f "usebackq delims=" %%l in ("%PWFile%") do ( 
16.
  set "Item=%%l" 
17.
  call :ConcatString Passwords 
18.
19.
 
20.
 
21.
set /a Idx=1 
22.
 
23.
for %%u in (%User%) do ( 
24.
  call :ProcessUser 
25.
  set /a Idx+=1 
26.
27.
 
28.
exit /b 
29.
 
30.
 
31.
 
32.
:ProcessUser 
33.
  for /f "tokens=%Idx%" %%p in ("%Passwords%") do ( 
34.
    echo %%~u %%p 
35.
36.
exit /b 
37.
 
38.
 
39.
 
40.
:ConcatString 
41.
  call set "%1=%%%1%% %%Item%%" 
42.
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]
Bitte warten ..
Mitglied: Skyemugen
22.06.2011 um 12:38 Uhr
Zitat von Kangaroojack:
35745kg/%


... was beim Bätscheln damit wohl passieren wird ...
Bitte warten ..
Mitglied: Friemler
22.06.2011 um 12:43 Uhr
Moin Skeymugen,

das wird ausgegeben.

Probleme machen nur Leerzeichen und Ausrufezeichen.

Gruß
Friemler
Bitte warten ..
Mitglied: Skyemugen
22.06.2011 um 12:45 Uhr
Aloha Friemler,

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

greetz André
Bitte warten ..
Mitglied: Friemler
22.06.2011 um 12:47 Uhr
Weil Du es nicht getestet hast.

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

Gruß
Bitte warten ..
Mitglied: Skyemugen
22.06.2011 um 13:00 Uhr
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
Bitte warten ..
Mitglied: Friemler
22.06.2011 um 13:07 Uhr
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]
Bitte warten ..
Mitglied: Kangaroojack
22.06.2011 um 15:21 Uhr
@ 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

Danke!
Bitte warten ..
Mitglied: Friemler
22.06.2011 um 15:24 Uhr
@Kangaroojack

Gern geschehen.

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

Gruß
Friemler
Bitte warten ..
Mitglied: jeb-the-batcher
22.06.2011 um 18:46 Uhr
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.
01.
setlocal EnableDelayedExpansion 
02.
set "variable=%%^!&<>" 
03.
FOR /F "delims=" %%a in (!variable!) DO ( 
04.
  setlocal DisableDelayedExpansion 
05.
  echo %%a 
06.
  endlocal 
07.
)
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
Bitte warten ..
Mitglied: Friemler
22.06.2011 um 19:16 Uhr
Hallo Jeb,

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:
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 ), 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
Bitte warten ..
Mitglied: jeb-the-batcher
22.06.2011 um 21:13 Uhr
Hallo Friemler,

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.

Hmm, entweder verstehe ich dich nicht oder ich verstehe mich nicht

Aber einen Widerspruch sehe ich hier nicht.
01.
@echo off 
02.
setlocal DisableDelayedExpansion 
03.
set "test=Ein Dach ^ mit Inhalt!" 
04.
echo Der echte Inhalt mit SET 
05.
set test 
06.
echo( 
07.
echo DDE-prozent     = %test% 
08.
for /F "delims=" %%a in ("%test%") do  echo DDE-Prozent-FOR = %%a 
09.
setlocal EnableDelayedExpansion 
10.
echo( 
11.
echo EDE-prozent     = %test% 
12.
echo EDE-Ausrufez.   = !test! 
13.
for /F "delims=" %%a in ("%test%") do  echo EDE-Prozent-FOR = %%a 
14.
for /F "delims=" %%a in ("!test!") do  echo EDE-Ausrufe-FOR = %%a 
15.
for /F "delims=" %%a in ("!test!") do  ( 
16.
	setlocal DisableDelayedExpansion 
17.
	echo EDE-Toggle-FOR  = %%a 
18.
	endlocal 
19.
)
01.
Der echte Inhalt mit SET 
02.
test=Ein Dach ^ mit Inhalt! 
03.
 
04.
DDE-prozent     = Ein Dach  mit Inhalt! 
05.
DDE-Prozent-FOR = Ein Dach ^ mit Inhalt! 
06.
 
07.
EDE-prozent     = Ein Dach  mit Inhalt 
08.
EDE-Ausrufez.   = Ein Dach ^ mit Inhalt! 
09.
EDE-Prozent-FOR = Ein Dach  mit Inhalt 
10.
EDE-Ausrufe-FOR = Ein Dach  mit Inhalt 
11.
EDE-Toggle-FOR  = Ein Dach ^ mit Inhalt!
Womit doch gezeigt ist, dass nach der Expansion mit !test! eben keine weitere Sonderzeichen ausgewertet werden

jeb
Bitte warten ..
Mitglied: Kangaroojack
24.02.2012 um 17:49 Uhr
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
Bitte warten ..
Mitglied: Skyemugen
24.02.2012 um 19:00 Uhr
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é
Bitte warten ..
Mitglied: Kangaroojack
25.02.2012 um 01:30 Uhr
Super, danke für den Hinweis.

Konnte damit zwar wenig anfangen, konnte mich aber nach einer anderen Lösung umsehen.
Hab 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:

01.
@echo off & setlocal 
02.
set "L1=C:\Temp\User.txt" 
03.
set "L2=C:\Temp\PW.txt" 
04.
set "oklog=C:\Temp\pwokLog.txt" 
05.
set "errorlog=C:\Temp\pwerrorLog.txt" 
06.
if exist "%oklog%" del "%oklog%" 
07.
if exist "%errorlog%" del "%errorlog%" 
08.
for /f "usebackq tokens=1" %%a in ("%L1%") do ( 
09.
	set "Line1=%%a" & call :ProcessLine 
10.
11.
start %errorlog% 
12.
start %oklog% 
13.
goto :eof 
14.
 
15.
:ProcessLine 
16.
for /f "tokens=1,* delims=:" %%b in ('findstr /n . "%L2%"^') do set "Line2=%%c" 
17.
	echo Passwort fuer Benutzer "%Line1%" wird auf "%Line2%" gesetzt 
18.
	net user %Line1% %Line2%>nul  
19.
	if errorlevel 1 goto :fehler 
20.
	if errorlevel 0 goto :ok 
21.
goto :eof 
22.
 
23.
:fehler 
24.
echo FEHLER beim setzen von Passwort fuer Benutzer "%Line1%">>"%errorlog%" 
25.
goto :eof 
26.
 
27.
:ok 
28.
echo Passwort fuer Benutzer "%Line1%" wurde erfolgreich auf "%Line2%" gesetzt>>"%oklog%"  
29.
goto :eof 
30.
 
31.
:eof
Bitte warten ..
Mitglied: bastla
25.02.2012 um 02:25 Uhr
Hallo Kangaroojack!

Das ließe sich noch etwas straffen:
01.
@echo off & setlocal 
02.
set "L1=C:\Temp\User.txt" 
03.
set "L2=C:\Temp\PW.txt" 
04.
set "oklog=C:\Temp\pwokLog.txt" 
05.
set "errorlog=C:\Temp\pwerrorLog.txt" 
06.
if exist "%oklog%" del "%oklog%" 
07.
if exist "%errorlog%" del "%errorlog%" 
08.
for /f "usebackq tokens=1" %%a in ("%L1%") do ( 
09.
	set "Line1=%%a" & call :ProcessLine 
10.
11.
start %errorlog% 
12.
start %oklog% 
13.
goto :eof 
14.
 
15.
:ProcessLine 
16.
for /f "tokens=1,* delims=:" %%b in ('findstr /n . "%L2%"') do set "Line2=%%c" 
17.
echo Passwort fuer Benutzer "%Line1%" wird auf "%Line2%" gesetzt 
18.
net user %Line1% %Line2%>nul && ( 
19.
    echo Passwort fuer Benutzer "%Line1%" wurde erfolgreich auf "%Line2%" gesetzt>>"%oklog%"  
20.
) || ( 
21.
    echo FEHLER beim setzen von Passwort fuer Benutzer "%Line1%">>"%errorlog%" 
22.
23.
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
Bitte warten ..
Mitglied: Kangaroojack
25.02.2012 um 13:57 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...