42687
Goto Top

Problem mit for und findstr variablen werden nicht richtig auslesen oder gesetzt

Hallo,

ich habe folgenden Code:
@echo on & enabledelayedexpansion
cls
rem Anmeldung Lehrer
rem von Juni 2008
rem letzte Aktualisierung August 2009
rem ------------------------------------------------
title SNW.systems - Anmeldung Lehrer
for /f "usebackq tokens=1* delims==" %%i in ("%logonserver%\SNW\SNW\config.ini") do set "%%i=%%j"  
if not exist == "%logonserver%\SNW\SNW\config.ini" msg %username% SNW.systems wurde auf dem Logonserver %logonserver% noch nicht eingerichtet. Bitte erst adminconfig ausführen oder Service anrufen. & pause>nul & goto ende  
rem -------------------------------------------------
net time \\%server% /set /yes >nul
net use * /delete /yes
if exist == "c:\user.txt" del c:\user.txt  
if exist == "c:\class.txt" del c:\class.txt  
:s1
for /f "tokens=1,2,3 delims=#" %%i in ('\\%Server%\logon\Anmeldung_lehrer.exe') do (set "klasse=%%i") & (set "klasse_b=%%j") & (set "benutzername=%%k")   
rem ----------------------------------------------
if not exist == "\\%Server%\%LEHRER%\%benutzername%" "\\%server%\netlogon\meldungen\l_nf.vbs" & goto s1  
rem --------------------------------------------
rem Fullname
set "Namensliste=\\%server%\%LEHRER%\fullname.csv"  
set "Delim=;"  
set "Eingabe=%schuelername%"  
for /f "tokens=1-5 delims=%Delim%" %%a in ('findstr /b /i /c:"%Eingabe%%Delim%" "%Namensliste%"') do (  
    set "benutzername=%%a"  
    set "vorname=%%b"  
    set "nachname=%%c"  
    set "fullname=%%d"  
	set "gesperrt=%%e"  
)
if /i %gesperrt% == yes "\\%server%\netlogon\Meldungen\gesperrt.vbs"  
Leider kommt beim letzten Eintrag if /i %gesperrt%, das nix verarbeitet werden kann, weder goto noch "\\server\netlogon\..."

Weiterhin werden alle Variablen nicht richtig ausgelesen oder gesetztl. Was ist da falsch?

Inhalt der fullname.csv:
KKulp;Karl;Kulp;Karl Kulp;no

Danke für eure Hilfe.

Content-Key: 121481

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

Printed on: April 25, 2024 at 04:04 o'clock

Member: bastla
bastla Jul 28, 2009 at 14:32:25 (UTC)
Goto Top
Hallo Peter161!

Bist Du sicher, dass %schuelername% einen Wert enthält (und zwar für Dein Beispiel "KKulp", da Du ja am Anfang der Zeile suchst)?

"delayedExpansion" wird (zumindest im geposteten Teil) nicht benötigt, allerdings wäre "setlocal" zu empfehlen.

Vor dem Auslesen der Daten ab Zeile 24 solltest Du zur Sicherheit die Variableninhalte von %benutzername% bis %gesperrt% löschen - zB
set "benutzername="
und nach dem Auslesen mit
if not defined benutzername echo %Eingabe% wurde nicht gefunden & goto :eof
prüfen, damit nicht ev mit "alten" Daten weitergearbeitet wird.

Ansonsten wäre mir noch aufgefallen, dass Du in Zeile 16 eine ".exe"-Datei ausliest ...

Grüße
bastla
Member: Biber
Biber Jul 28, 2009 at 15:05:00 (UTC)
Goto Top
Moin Peter161,

ergänzend zu bastlas Anmerkungen auch noch ein oder zwei.

Zum einen ist nicht ersichtlich, woher denn die benutzte Variable %LEHRER% kommen mag.
Sollte diese warum-auch-immer "richtig" gesetzt sein: Glückwunsch.
Allerdings gehört so eine Art der Programmierung verbot°H^H gut dokumentiert.

Das ist übrigens mein Hauptanliegen in diesem Kommentar.
Wenn Du offensichtlich gerade bei Batchskripting (noch) einige Schwierigkeiten hast,
bitte nutze doch -auch für Dich selbst- die Möglichkeit zur Kommentierung.

Das "rem Anmeldung Lehrer" lasse ich ja durchaus als sinnvollen Kommentar gelten.
Aber wenn alle weiteren Kommentare aus einem "rem --------------" bestehen, dann hast Du etwas falsch verstanden.
Es geht in Sourcecodes zwar relativ oft darum, dass alles ordentlich aussieht.
Damit ist allerdings mehr die Strukturierung, Einrückung, Verwendung sinnvoller Variablennamen und eben auch Kommentare gemeint.

Und es soll keine Schikane sein, sondern eine Chance für Dich selbst, den selbstgetippselten Code auch noch nach ein paar Monaten lesen und verstehen zu können.

Grüße
Biber
Member: bastla
bastla Jul 28, 2009 at 15:16:50 (UTC)
Goto Top
@Biber
woher denn die benutzte Variable %LEHRER% kommen mag.
Mein Tipp: Zeile 8

@42687
Noch ein Nachtrag: Nach einem "exist" (Zeilen 13, 14, 18) brauchst Du keine "==" ...

Grüße
bastla
Mitglied: 42687
42687 Jul 28, 2009 at 15:18:30 (UTC)
Goto Top
Zitat von @bastla:
Hallo Peter161!

Bist Du sicher, dass %schuelername% einen Wert enthält (und zwar
für Dein Beispiel "KKulp", da Du ja
am Anfang der Zeile suchst)?
Nein, ich bin echt blöd...^^
Ich hab alles von Schuelername auf Benutzername umgestellt und dabei diese eine Zeile vergessen. Leider sieht man dann manchmal den Wald vor lauter Bäumen nicht mehr.

"delayedExpansion" wird (zumindest im geposteten Teil)
nicht benötigt, allerdings wäre "setlocal" zu
empfehlen.
setlocal war auch dir, ich dachte nur, dass das die Fehlerursache sein kann. Könntest du mir bitte nochmal kurz erklären wozu delayedExpansion ist. Danke.

Vor dem Auslesen der Daten ab Zeile 24 solltest Du zur Sicherheit die
Variableninhalte von %benutzername% bis %gesperrt% löschen - zB
set "benutzername="
> 
und nach dem Auslesen mit
if not defined benutzername echo
> %Eingabe% wurde nicht gefunden & goto :eof
> 
prüfen, damit nicht ev mit "alten" Daten
weitergearbeitet wird.
Jo, mach ich, danke.

Ansonsten wäre mir noch aufgefallen, dass Du in Zeile 16 eine
".exe"-Datei ausliest ...
Nein das ist schon OK. Der ruft die EXE auf und dort werden eingaben gemacht und wieder an die batch zurückgegeben. Das ist ein grafische Oberfläche als Anmeldemaske.

Danke. Achso weißt du warum das mit if /i %gesperrt% und so ni klappt? Ach vielleicht weil er gar nix ausgelesen hat. Wenn es jetzt geht melde ich mich. Danke.

Grüße
bastla

VIELE GRÜßE

Willi
Mitglied: 42687
42687 Jul 28, 2009 at 15:23:05 (UTC)
Goto Top
Zitat von @Biber:
Moin Peter161,

ergänzend zu bastlas Anmerkungen auch noch ein oder zwei.

Zum einen ist nicht ersichtlich, woher denn die benutzte Variable
%LEHRER% kommen mag.
for /f "usebackq tokens=1* delims==" %%i in ("%logonserver%\SNW\SNW\config.ini") do set "%%i=%%j"   
ließt eine INI aus in der zb %lehrer% steht.
Sollte diese warum-auch-immer "richtig" gesetzt sein:
Glückwunsch.
danke für die Blumen
Allerdings gehört so eine Art der Programmierung
verbot°H^H gut dokumentiert.
möchte gar nicht wissen was hier stand.

Das ist übrigens mein Hauptanliegen in diesem Kommentar.
Wenn Du offensichtlich gerade bei Batchskripting (noch) einige
Schwierigkeiten hast,
bitte nutze doch -auch für Dich selbst- die Möglichkeit zur
Kommentierung.
Mach ich auch, aber das was ich rein gestellt habe, ist nur ein winziger Teil, damit ich euch nicht noch mehr verrückt mache, mit zeug was eigentlich egal ist.

Das "rem Anmeldung Lehrer" lasse ich ja durchaus als
sinnvollen Kommentar gelten.
Ist einfach ne Info für mich.
Aber wenn alle weiteren Kommentare aus einem "rem
" bestehen, dann hast Du etwas falsch verstanden.
Es geht in Sourcecodes zwar relativ oft darum, dass alles
ordentlich aussieht.
ja, da müsstest du mal den rest meiner Batch sehen. Im Normalfall ist immer
rem Erklärung Gruppe 1
Anweisungsgruppe1
rem ---------------------
rem Erklärung Gruppe 2
Anweisungsgruppe 2
rem -----------
Damit ist allerdings mehr die Strukturierung, Einrückung,
Verwendung sinnvoller Variablennamen und eben auch Kommentare
gemeint.

Und es soll keine Schikane sein, sondern eine Chance für Dich
selbst, den selbstgetippselten Code auch noch nach ein paar Monaten
lesen und verstehen zu können.
is klar.

Grüße
Grüße zurück
Biber
Mitglied: 42687
42687 Jul 28, 2009 at 15:25:02 (UTC)
Goto Top
Zitat von @bastla:
@Biber
> woher denn die benutzte Variable %LEHRER% kommen mag.
Mein Tipp: Zeile 8

@42687
Noch ein Nachtrag: Nach einem "exist" (Zeilen 13, 14, 18)
brauchst Du keine "==" ...
Danke, wusste ich ni, dass das bei exist ni is, aber wo brauchte man das gleich? also 2?
Habs schon geändert.

Grüße
bastla

bb pete
Member: bastla
bastla Jul 28, 2009 at 15:41:09 (UTC)
Goto Top
Hallo Peter161!
Ansonsten wäre mir noch aufgefallen, dass Du in Zeile 16 eine
".exe"-Datei ausliest ...
Nein das ist schon OK. Der ruft die EXE auf und dort werden eingaben gemacht und wieder an die Batch zurückgegeben. Das ist ein grafische Oberfläche als Anmeldemaske.
Sorry, hatte die Apostrophe nicht (richtig) gesehen ...
Könntest du mir bitte nochmal kurz erklären wozu delayedExpansion ist. Danke.
Wenn innerhalb eines Blocks (= zB eine Zeile, ev aus mehreren mit "&" verknüpften Befehlen bestehend, oder häufig der "do"-Teil einer "for"-Schleife) eine Variable vorkommt, so wird diese gleich am Beginn der Verarbeitung dieses Blocks ausgewertet - wenn sich ihr Inhalt innerhalb des Blocks ändert, wird der neue Inhalt der Variablen erst nach dem Block "erkannt", im Block wird weiterhin der zu Beginn der Verarbeitung ermittelte Wert verwendet.

Um dieses Verhalten zu ändern, kann mit "setlocal enabledelayedexpansion" die "verzögerte Variablenauflösung" erzwungen werden - da jetzt erst innerhalb des Blockes (bei Schleifen mehrmals, nämlich in jedem Durchlauf) die Variable ausgewertet wird, steht der neue Inhalt sofort zur Verfügung.

Die Schreibweise der Variablen muss dazu allerdings von "%Variable%" auf "!Variable!" geändert werden, was den unschönen Nebeneffekt hat, dass in einem Variablenwert vorkommende Rufzeichen als Begrenzungszeichen interpretiert werden und, ja nach Anzahl selbiger, der Variableninhalt abgeschnitten wird oder teilweise "verschwindet".

Ein Beispiel für eine Anwendung der "delayedexpansion" wäre Deine Schleife ab Zeile 24: Wenn Du etwa aus erstem Zeichen von %vorname% und %nachname% erst den "Anmeldenamen" kombinieren wolltest, könntest Du dies innerhalb der Schleife nur tun, wenn die gelesenen Variableninhalte sofort zur Verfügung stünden - die Schleife sähe dann etwa so aus:
setlocal enabledelayedexpansion
for /f "tokens=1-5 delims=%Delim%" %%a in ('findstr /b /i /c:"%Eingabe%%Delim%" "%Namensliste%"') do (  
    set "benutzername=%%a"  
    set "vorname=%%b"  
    set "nachname=%%c"  
    set "fullname="  
    set "gesperrt=%%e"  
    set "anmeldename=!vorname:~,1!!nachname!"  
)
Auch das Auswerten (BTW: hier siehst Du die Anwendung der Schreibweise "==", nämlich als Ersatz für "equ") der Variablen %gesperrt% innerhalb der Schleife könnte nur so erfolgen:
if /i "!gesperrt!"=="yes" echo !benutzername! ist gesperrt
Da Du aber ohnehin nur jeweils einen Schleifendurchlauf benötigst (es soll ja nur ein bestimmter Benutzer gelesen werden), kannst Du die Weiterverarbeitung auch nach der Schleife durchführen, weswegen keine "delayedexpansion" erforderlich ist.

Grüße
bastla

P.S.: Das "kurz" vor "erklären" muss ich irgendwie übersehen haben ... face-wink