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

Textdatei zeilenweise in Variable schreiben

Frage Entwicklung Batch & Shell

Mitglied: goodbytes

goodbytes (Level 2) - Jetzt verbinden

28.04.2014, aktualisiert 23:25 Uhr, 1655 Aufrufe, 20 Kommentare

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:
01.
andreas;H;I;J 
02.
maik;H;V 
03.
ralf;H;M;Q 
04.
linus;H;I:F 
05.
magnus;H;I;Q;M
Um in der Textdatei nach dem Namen des sich gerade anmeldenden Users zu suchen habe ich folgenden Ansatz:
01.
SET UserList=D:\Test.txt 
02.
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...
Mitglied: bastla
LÖSUNG 28.04.2014, aktualisiert 05.05.2014
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
Bitte warten ..
Mitglied: Xaero1982
LÖSUNG 28.04.2014, aktualisiert 05.05.2014
Nabend,

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

01.
do echo %%a
auch

01.
do net use %%a: \\blabla
einsetzen und dann hast du gleich deine Netzlaufwerke erstellt.

Gruß
Bitte warten ..
Mitglied: bastla
LÖSUNG 28.04.2014, aktualisiert 05.05.2014
... was natürlich zur Frage führt, woher "\\blabla" kommt ...

Grüße
bastla
Bitte warten ..
Mitglied: Xaero1982
LÖSUNG 28.04.2014, aktualisiert 05.05.2014
...das stimmt wohl ... das könnte er natürlich auch noch in die Textdatei reinschreiben ...

Da haste doch sicher auch noch ne Idee parat...

Gruß
Bitte warten ..
Mitglied: goodbytes
28.04.2014, aktualisiert um 23:58 Uhr
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
Bitte warten ..
Mitglied: bastla
LÖSUNG 29.04.2014, aktualisiert 05.05.2014
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
01.
H:;\\10.20.30.40\ShareH 
02.
I:;\\10.20.30.41\ShareI 
03.
J:;\\10.20.30.41\ShareJ
und dann nach dem gleichen Schema verwenden:
01.
for /f "tokens=1* delims=;" %%i in ('findstr /ib "%username%;" "%UserList%"') do for %%a in (%%j) do ( 
02.
    for /f "tokens=2 delims=;" %%s in ('findstr /ib "%%a" "ShareList%"') do net use %%a %%s /p:no 
03.
)
Grüße
bastla
Bitte warten ..
Mitglied: goodbytes
05.05.2014, aktualisiert um 13:52 Uhr
Hallo bastla und Xaero1982,

vielen Dank für eure Hilfe !!!

Jetzt funktioniert es bestens.

So sieht es nun fertig aus:

01.
set UserList=user.txt 
02.
set ShareList=shares.txt 
03.
 
04.
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) 
05.
goto ENDE 
06.
 
07.
:MAP 
08.
net use %LW%: %PFAD% /p:no 
09.
goto :EOF 
10.
 
11.
:ENDE 
12.
set LW= 
13.
set PFAD= 
14.
set UserList= 
15.
set ShareList=
Wie gesagt, vielen Dank und eine schöne Woche !!!

Torsten
Bitte warten ..
Mitglied: goodbytes
07.05.2014 um 12:44 Uhr
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
Bitte warten ..
Mitglied: bastla
LÖSUNG 07.05.2014, aktualisiert 09.05.2014
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
Bitte warten ..
Mitglied: goodbytes
07.05.2014 um 15:47 Uhr
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...

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 H.
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.

01.
set UserList=user.txt 
02.
set ShareList=shares.txt 
03.
 
04.
:START 
05.
for /f %%i in ('findstr /ib "%UserName%" "%UserList%"') do call :WEITER 
06.
echo ^%UserName%;H>> %UserList% 
07.
for /f "tokens=2 delims=;" %%s in ('findstr /ib "H:" "%ShareList%"') do set Pfad=%%s & call :MAPFILE %%s 
08.
:: Benachrichtigung über neuen User an Admin... 
09.
goto ENDE 
10.
 
11.
:MAPFILE 
12.
net use H: | find /i "%1%" 
13.
if %ERRORLEVEL% == 0 goto NEXT_1 
14.
if not exist %1% goto NEXT_1 
15.
net use /d H: /y 
16.
echo Neuer User: "%UserName%" bekommt Laufwerk: H: %1% 
17.
net use H: %1% 
18.
:NEXT_1 
19.
goto :EOF 
20.
 
21.
:WEITER 
22.
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) 
23.
goto ENDE 
24.
 
25.
:MAP 
26.
net use %1%: | find /i "%2%" 
27.
if %ERRORLEVEL% == 0 goto NEXT_2 
28.
if not exist %2% goto NEXT_2 
29.
net use /d %1%: /y 
30.
echo "%UserName%" bekommt Laufwerk: %1%: %2% 
31.
net use %1%: %2% 
32.
:NEXT_2 
33.
goto :EOF 
34.
 
35.
:ENDE 
36.
set UserList= 
37.
set ShareList= 
38.
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
Bitte warten ..
Mitglied: goodbytes
08.05.2014 um 14:36 Uhr
Keiner eine Idee? Hab irgendwas von Backquotas gelesen, aber das geht irgendwie nicht...
Bitte warten ..
Mitglied: bastla
LÖSUNG 08.05.2014, aktualisiert 09.05.2014
Hallo TorstenB!

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

Grüße
bastla
Bitte warten ..
Mitglied: goodbytes
09.05.2014 um 12:23 Uhr
Hallo bastla,
nun ja, stimmt... Geht...

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

Ansonsten ist jetzt hier das fertige laufende Script:

01.
set UserList=user.txt 
02.
set ShareList=shares.txt 
03.
 
04.
:START 
05.
for /f %%i in ('findstr /ib "%UserName%" "%UserList%"') do call :WEITER 
06.
echo ^%UserName%;H>> %UserList% 
07.
for /f "tokens=2 delims=;" %%s in ('findstr /ib "H:" "%ShareList%"') do set Pfad=%%s & call :MAPFILE %%s 
08.
goto ENDE 
09.
 
10.
:MAPFILE 
11.
net use H: | find /i "%1" 
12.
if %ERRORLEVEL% == 0 goto NEXT_1 
13.
if not exist %1 goto NEXT_1 
14.
net use /d H: %i/y 
15.
echo Neuer User: "%UserName%" bekommt Laufwerk: H: %1 
16.
net use H: %1 /persistent:yes 
17.
:NEXT_1 
18.
goto :EOF 
19.
 
20.
:WEITER 
21.
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) 
22.
goto ENDE 
23.
 
24.
:MAP 
25.
net use %1: | find /i "%2" 
26.
if %ERRORLEVEL% == 0 goto NEXT_2 
27.
if not exist %2 goto NEXT_2 
28.
net use /d %1: /y 
29.
echo "%UserName%" bekommt Laufwerk: %1: %2 
30.
net use %1: %2 /persistent:yes 
31.
:NEXT_2 
32.
goto :EOF 
33.
 
34.
:ENDE 
35.
set UserList= 
36.
set ShareList=
Ich wünsch euch allen schon mal ein schönes Wochenende und danke für die Hilfe !!!

Gruß
Torsten
Bitte warten ..
Mitglied: bastla
LÖSUNG 09.05.2014, aktualisiert um 13:27 Uhr
Hallo TorstenB!
Aber kannst du mir bitte erklären warum es hier dann nicht %1% ist?
Haben die Programmierer der CMD-Shell so festgelegt - tatsächlich könntest Du eine Variable %1% auf "normalem" Weg erzeugen und verwenden:
01.
set 1=eins 
02.
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
Bitte warten ..
Mitglied: goodbytes
09.05.2014 um 13:28 Uhr
Alles klar bastla, weiß ich jetzt Bescheid. Danke dir!

Gruß
Torsten
Bitte warten ..
Mitglied: goodbytes
15.05.2014 um 11:54 Uhr
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
Bitte warten ..
Mitglied: bastla
LÖSUNG 15.05.2014, aktualisiert 19.05.2014
Hallo TorstenB!

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

Grüße
bastla
Bitte warten ..
Mitglied: goodbytes
15.05.2014 um 14:33 Uhr
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
Bitte warten ..
Mitglied: bastla
LÖSUNG 15.05.2014, aktualisiert 19.05.2014
Hallo TorstenB!

Am einfachsten wäre das über eine Temp-Datei, die nur die Usernamen enthält, zu lösen - also schematisch etwa
01.
set "UserNamesOnly=%temp%\usernamesonly.txt" 
02.
del %UserNamesOnly% 2>nul 
03.
for /f "delims=;" %%i in (%UserListAlt%) do >>%UserNamesOnly% echo %%i; 
04.
 
05.
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
Bitte warten ..
Mitglied: goodbytes
19.05.2014 um 11:33 Uhr
Hi bastla,
geht perfekt, ich danke dir und wünsche dir eine schöne Woche !!!

Gruß
Torsten
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
gelöst Aktueller Besitzer der aktuellen Datei herausfinden und in Variable schreiben (11)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
gelöst DWORD (Name immer verschieden) eines RegKeys auslesen und in Variable schreiben (2)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
gelöst Mehrere Ordnernamen auslesen und in eine Variable schreiben (5)

Frage von schmitho zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...