
42687
28.07.2009, aktualisiert um 13:04:10 Uhr
Problem mit for und findstr variablen werden nicht richtig auslesen oder gesetzt
Hallo,
ich habe folgenden Code:
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:
Danke für eure Hilfe.
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"
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 121481
Url: https://administrator.de/forum/problem-mit-for-und-findstr-variablen-werden-nicht-richtig-auslesen-oder-gesetzt-121481.html
Ausgedruckt am: 07.05.2025 um 19:05 Uhr
7 Kommentare
Neuester Kommentar
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
und nach dem Auslesen mit
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
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="
if not defined benutzername echo %Eingabe% wurde nicht gefunden & goto :eof
Ansonsten wäre mir noch aufgefallen, dass Du in Zeile 16 eine ".exe"-Datei ausliest ...
Grüße
bastla
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 Programmierungverbot°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
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
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
@Biber
@42687
Noch ein Nachtrag: Nach einem "exist" (Zeilen 13, 14, 18) brauchst Du keine "==" ...
Grüße
bastla
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
Hallo Peter161!
Sorry, hatte die Apostrophe nicht (richtig) gesehen ...
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:
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:
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 ...
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.".exe"-Datei ausliest ...
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!"
)
if /i "!gesperrt!"=="yes" echo !benutzername! ist gesperrt
Grüße
bastla
P.S.: Das "kurz" vor "erklären" muss ich irgendwie übersehen haben ...