goodbytes
Goto Top

Textdatei zeilenweise in Variable schreiben

Hallo,
mit einer Batch möchte ich mehrere Laufwerke mappen, abhängig vom Usernamen. Klar könnte ich auch für jeden User eine einzelne Batch machen, das finde ich aber ziemlich unübersichtlich.
Meine Idee ist nun die User in einer mit Trennzeichen versehene Textdatei zu erfassen und da die Laufwerke zuzuordnen.

Beispiel Textdatei:
andreas;H;I;J
maik;H;V
ralf;H;M;Q
linus;H;I:F
magnus;H;I;Q;M

Um in der Textdatei nach dem Namen des sich gerade anmeldenden Users zu suchen habe ich folgenden Ansatz:
SET UserList=D:\Test.txt
for /f %%i in (%UserList%) do (echo %%i | if /I "%%i" == %USERNAME% echo %%i)  

Damit stoße ich auf die Zeile des richtigen Users. Nun müsste ich im Prinzip alles, was in dieser Zeile nach dem ersten Trennzeichen kommt in ein Array einlesen, oder immer kurz mittels
call :Sprungmarke %%i zu meinem net use %InhaltdesFeldes%: \\IP-Adresse gehen und das so abwickeln. Bei der Array-Variante halt in einer Schleife bis zum letzten Wert.

Momentan hatte ich zum Testen nur das echo %%i drin. Wie müsste ich da jetzt weiter machen?

Vielen Dank im Voraus!

Torsten

Ach ja, wenn der User noch nicht in der Liste existiert könnte man eigentlich mit %USERNAME% >> %UserList% erstmal ohne zugeordnete Laufwerke ans Ende der Liste geschrieben werden, das wäre ja auch eine Idee. Da vergisst man dann wenigstens keinen bei neuen Usern... Aber da müsste ich irgendwann mitbekommen wenn der Name nicht gefunden wurde...

Content-Key: 236682

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

Printed on: April 26, 2024 at 07:04 o'clock

Member: bastla
Solution bastla Apr 28, 2014, updated at May 05, 2014 at 11:38:24 (UTC)
Goto Top
Hallo TorstenB!

Mein Ansatz zum Suchen sähe eher so aus:
for /f "tokens=1* delims=;" %%i in ('findstr /ib "%username%;" "%UserList%"') do for %%a in (%%j) do echo %%a
Mit
findstr /ib "%username%;" "%UserList%">nul || echo Aktueller User nicht in Liste
könntest Du vorweg kontrollieren, ob der User schon in die Liste aufgenommen wurde.

Grüße
bastla
Member: Xaero1982
Solution Xaero1982 Apr 28, 2014, updated at May 05, 2014 at 11:38:26 (UTC)
Goto Top
Nabend,

und um Bastla's Ansatz noch zu ergänzen kannst du statt

do echo %%a

auch

do net use %%a: \\blabla

einsetzen und dann hast du gleich deine Netzlaufwerke erstellt.

Gruß
Member: bastla
Solution bastla Apr 28, 2014, updated at May 05, 2014 at 11:38:28 (UTC)
Goto Top
... was natürlich zur Frage führt, woher "\\blabla" kommt ...

Grüße
bastla
Member: Xaero1982
Solution Xaero1982 Apr 28, 2014, updated at May 05, 2014 at 11:38:30 (UTC)
Goto Top
...das stimmt wohl ... das könnte er natürlich auch noch in die Textdatei reinschreiben ...

Da haste doch sicher auch noch ne Idee parat... face-smile

Gruß
Member: goodbytes
goodbytes Apr 28, 2014 updated at 21:58:30 (UTC)
Goto Top
Hallo bastla, hallo Xaero1982,

An bastla...
So sieht es natürlich noch effektiver aus, stimmt.

An Xaero1982...
Ich werde aber sicher mittels Call :Sprungmarke %%a dennoch rausspringen, weil ich ja eh schauen muss welcher Buchstabe gerade in %%a ist, um das entsprechende Laufwerk zuzuordnen. Aber das ist kein Problem, das kann ich dann mittels select case usw. abdecken.
Ich werd's morgen früh probieren, heute ist es mir schon zu spät, war ein langer Tag.

Ich danke euch!!!

Gruß
Torsten
Member: bastla
Solution bastla Apr 29, 2014, updated at May 05, 2014 at 11:38:33 (UTC)
Goto Top
Hallo TorstenB!
weil ich ja eh schauen muss welcher Buchstabe gerade in %%a ist, um das entsprechende Laufwerk zuzuordnen.
Ließe sich aber natürlich, so wie von Xaero1982 angeregt, ebenfalls in eine Textdatei auslagern - zB
H:;\\10.20.30.40\ShareH
I:;\\10.20.30.41\ShareI
J:;\\10.20.30.41\ShareJ
und dann nach dem gleichen Schema verwenden:
for /f "tokens=1* delims=;" %%i in ('findstr /ib "%username%;" "%UserList%"') do for %%a in (%%j) do (  
    for /f "tokens=2 delims=;" %%s in ('findstr /ib "%%a" "ShareList%"') do net use %%a %%s /p:no  
)
Grüße
bastla
Member: goodbytes
goodbytes May 05, 2014 updated at 11:52:31 (UTC)
Goto Top
Hallo bastla und Xaero1982,

vielen Dank für eure Hilfe !!! face-smile

Jetzt funktioniert es bestens.

So sieht es nun fertig aus:

set UserList=user.txt
set ShareList=shares.txt

for /f "tokens=1* delims=;" %%i in ('findstr /ib "%UserName%;" "%UserList%"') do for %%a in (%%j) do (for /f "tokens=2 delims=;" %%s in ('findstr /ib "%%a" "%ShareList%"') do set LW=%%a && set Pfad=%%s && call :MAP)  
goto ENDE

:MAP
net use %LW%: %PFAD% /p:no
goto :EOF

:ENDE
set LW=
set PFAD=
set UserList=
set ShareList=

Wie gesagt, vielen Dank und eine schöne Woche !!! face-smile

Torsten
Member: goodbytes
goodbytes May 07, 2014 at 10:44:50 (UTC)
Goto Top
Hab da doch noch ein kleines Problem...

An der Zeile 04 bei meinem letzten Post schreibe ich %%a doch in die Variable %LW%.
Leider wird da auch das Leerzeichen danach mit rein geschrieben.

Normalerweise kann ich doch mit "call" auch Parameter übergeben? Aber ein "call :MAP %%a %%s" funktioniert nicht.

Wie kann ich das machen?

Gruß
Torsten
Member: bastla
Solution bastla May 07, 2014, updated at May 09, 2014 at 10:24:17 (UTC)
Goto Top
Hallo TorstenB!
Aber ein "call :MAP %%a %%s" funktioniert nicht.
Inwiefern? Du verwendest in :MAP doch %1 und %2 für die übergebenen Parameter?

Woher kommt übrigens das Leerzeichen nach %%a?

Grüße
bastla
Member: goodbytes
goodbytes May 07, 2014 at 13:47:16 (UTC)
Goto Top
Hallo Bastla,
das Leerzeichen kam sicher durch das Leerzeichen vor dem "&" in "LW=%%a &".
Aber klar, mit %1% und %2% geht es natürlich bestens, hab irgendwie daquere gedacht... face-wink

Hier ist auf jeden Fall mein fertiger Code jetzt. Ich prüfe ab, ob der User, der sich gerade anmeldet, bereits in der Liste ist, wenn nicht wird er hinzugefügt und bekommt zumindest erst einmal das Standard-File-Laufwerk, welches auf jeden Fall jeder hat (hier als beispiel Laufwerk Hface-smile.
Dabei prüfe ich ab, ob das richtige Laufwerk auf den richtigen Buchstaben gemappt ist, und ob der Pfad erreichbar ist. Wenn es falsch gemappt ist wird es getrennt. Auf jeden Fall wird es verbunden, wenn es das vorher noch nicht war.

set UserList=user.txt
set ShareList=shares.txt

:START
for /f %%i in ('findstr /ib "%UserName%" "%UserList%"') do call :WEITER  
echo ^%UserName%;H>> %UserList%
for /f "tokens=2 delims=;" %%s in ('findstr /ib "H:" "%ShareList%"') do set Pfad=%%s & call :MAPFILE %%s  
:: Benachrichtigung über neuen User an Admin...
goto ENDE

:MAPFILE
net use H: | find /i "%1%"  
if %ERRORLEVEL% == 0 goto NEXT_1
if not exist %1% goto NEXT_1
net use /d H: /y
echo Neuer User: "%UserName%" bekommt Laufwerk: H: %1%  
net use H: %1%
:NEXT_1
goto :EOF

:WEITER
for /f "tokens=1* delims=;" %%i in ('findstr /ib "%UserName%" "%UserList%"') do for %%a in (%%j) do (for /f "tokens=2 delims=;" %%s in ('findstr /ib "%%a" "%ShareList%"') do call :MAP %%a %%s)  
goto ENDE

:MAP
net use %1%: | find /i "%2%"  
if %ERRORLEVEL% == 0 goto NEXT_2
if not exist %2% goto NEXT_2
net use /d %1%: /y
echo "%UserName%" bekommt Laufwerk: %1%: %2%  
net use %1%: %2%
:NEXT_2
goto :EOF

:ENDE
set UserList=
set ShareList=
PAUSE

Im Normalfall sollte es immer verbunden sein an dem eigenen Rechner. Aber wenn sich der User woanders im Netzwerk anmeldet soll es ebenso greifen.
Eine Sache wundert mich hier aber. Ich wollte beim mappen wie gehabt den Schalter "/persistent:yes" verwenden: "net use %1%: %2% /persistent:yes" . Das funktioniert aber nicht. Nach %2% ist Schluss, sieht dann so aus: "\\IP-Adresse\MeineFreigabeyes". "yes" wird also einfach drangehangen, wodurch das Mappen natürlich fehlschlägt. Wo liegt da das Problem?

Gruß
Torsten
Member: goodbytes
goodbytes May 08, 2014 at 12:36:23 (UTC)
Goto Top
Keiner eine Idee? Hab irgendwas von Backquotas gelesen, aber das geht irgendwie nicht... face-plain
Member: bastla
Solution bastla May 08, 2014, updated at May 09, 2014 at 10:24:12 (UTC)
Goto Top
Hallo TorstenB!

Ändert sich etwas, wenn Du richtig %1 (und nicht %1%) verwendest?

Grüße
bastla
Member: goodbytes
goodbytes May 09, 2014 at 10:23:49 (UTC)
Goto Top
Hallo bastla,
nun ja, stimmt... Geht... face-plain

Aber kannst du mir bitte erklären warum es hier dann nicht %1% ist?

Ansonsten ist jetzt hier das fertige laufende Script:

set UserList=user.txt
set ShareList=shares.txt

:START
for /f %%i in ('findstr /ib "%UserName%" "%UserList%"') do call :WEITER  
echo ^%UserName%;H>> %UserList%
for /f "tokens=2 delims=;" %%s in ('findstr /ib "H:" "%ShareList%"') do set Pfad=%%s & call :MAPFILE %%s  
goto ENDE

:MAPFILE
net use H: | find /i "%1"  
if %ERRORLEVEL% == 0 goto NEXT_1
if not exist %1 goto NEXT_1
net use /d H: %i/y
echo Neuer User: "%UserName%" bekommt Laufwerk: H: %1  
net use H: %1 /persistent:yes
:NEXT_1
goto :EOF

:WEITER
for /f "tokens=1* delims=;" %%i in ('findstr /ib "%UserName%" "%UserList%"') do for %%a in (%%j) do (for /f "tokens=2 delims=;" %%s in ('findstr /ib "%%a" "%ShareList%"') do call :MAP %%a %%s)  
goto ENDE

:MAP
net use %1: | find /i "%2"  
if %ERRORLEVEL% == 0 goto NEXT_2
if not exist %2 goto NEXT_2
net use /d %1: /y
echo "%UserName%" bekommt Laufwerk: %1: %2  
net use %1: %2 /persistent:yes
:NEXT_2
goto :EOF

:ENDE
set UserList=
set ShareList=

Ich wünsch euch allen schon mal ein schönes Wochenende und danke für die Hilfe !!! face-smile

Gruß
Torsten
Member: bastla
Solution bastla May 09, 2014 updated at 11:27:51 (UTC)
Goto Top
Hallo TorstenB!
Aber kannst du mir bitte erklären warum es hier dann nicht %1% ist?
Haben die Programmierer der CMD-Shell so festgelegt face-wink - tatsächlich könntest Du eine Variable %1% auf "normalem" Weg erzeugen und verwenden:
set 1=eins
echo %1%
- hier ging es aber um die Parametervariablen, und diese (%0 bis %9) sind nur mit führendem Prozentzeichen zu schreiben - schau Dir mal call /? an ...

Grüße
bastla
Member: goodbytes
goodbytes May 09, 2014 at 11:28:28 (UTC)
Goto Top
Alles klar bastla, weiß ich jetzt Bescheid. Danke dir! face-smile

Gruß
Torsten
Member: goodbytes
goodbytes May 15, 2014 at 09:54:20 (UTC)
Goto Top
Hallo,
eine Frage hab ich dennoch.

Ich möchte mittels Batch die "user.txt" per Task in gewissen Zeitabständen mit einer älteren Kopie vergleichen. Aber nur die erste Spalte, also wo die Namen drin stehen. Zusätzliche Einträge sollen in eine Variable (am besten ein Array) geschrieben werden.
Wie könnte ich das realisieren?

Gruß
Torsten
Member: bastla
Solution bastla May 15, 2014, updated at May 19, 2014 at 09:32:31 (UTC)
Goto Top
Hallo TorstenB!

Was soll konkret verglichen werden, bzw was soll bei Unterschieden dann weiter passieren?

Grüße
bastla
Member: goodbytes
goodbytes May 15, 2014 at 12:33:40 (UTC)
Goto Top
Hallo bastla,
eigentlich möchte ich abprüfen welche Benutzernamen NICHT in beiden zu vergleichenden Listen vorhanden sind und es nacheinander in eine Variable schreiben für eine Info per Mail (die Mail versende ich dann per Batch mittels mailsend.exe, die Namen sollen nur zur Info in der Mail drin stehen. Das soll dann einmal täglich per Task laufen.

Gruß
Torsten
Member: bastla
Solution bastla May 15, 2014, updated at May 19, 2014 at 09:32:17 (UTC)
Goto Top
Hallo TorstenB!

Am einfachsten wäre das über eine Temp-Datei, die nur die Usernamen enthält, zu lösen - also schematisch etwa
set "UserNamesOnly=%temp%\usernamesonly.txt"  
del %UserNamesOnly% 2>nul
for /f "delims=;" %%i in (%UserListAlt%) do >>%UserNamesOnly% echo %%i;  

for /f "tokens=1* delims=;" %%i in ('findstr /ibvg:%UserNamesOnly% "%UserList%"') do echo %%i_%%j  
Die letzte Schleife liefert dann in %%i den Namen und in %%j den Rest der Zeile für jeden in der Datei "%UserListAlt%" nicht enthaltenen Namen der "%UserList%" - ein Array sollte auch hier demnach nicht nötig sein ...

Grüße
bastla
Member: goodbytes
goodbytes May 19, 2014 at 09:33:34 (UTC)
Goto Top
Hi bastla,
geht perfekt, ich danke dir und wünsche dir eine schöne Woche !!! face-smile

Gruß
Torsten