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

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

Frage Entwicklung Batch & Shell

Mitglied: Peter161

Peter161 (Level 1) - Jetzt verbinden

28.07.2009, aktualisiert 13:04 Uhr, 4776 Aufrufe, 7 Kommentare

Hallo,

ich habe folgenden Code:
01.
@echo on & enabledelayedexpansion 
02.
cls 
03.
rem Anmeldung Lehrer 
04.
rem von Juni 2008 
05.
rem letzte Aktualisierung August 2009 
06.
rem ------------------------------------------------ 
07.
title SNW.systems - Anmeldung Lehrer 
08.
for /f "usebackq tokens=1* delims==" %%i in ("%logonserver%\SNW\SNW\config.ini") do set "%%i=%%j" 
09.
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 
10.
rem ------------------------------------------------- 
11.
net time \\%server% /set /yes >nul 
12.
net use * /delete /yes 
13.
if exist == "c:\user.txt" del c:\user.txt 
14.
if exist == "c:\class.txt" del c:\class.txt 
15.
:s1 
16.
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")  
17.
rem ---------------------------------------------- 
18.
if not exist == "\\%Server%\%LEHRER%\%benutzername%" "\\%server%\netlogon\meldungen\l_nf.vbs" & goto s1 
19.
rem -------------------------------------------- 
20.
rem Fullname 
21.
set "Namensliste=\\%server%\%LEHRER%\fullname.csv" 
22.
set "Delim=;" 
23.
set "Eingabe=%schuelername%" 
24.
for /f "tokens=1-5 delims=%Delim%" %%a in ('findstr /b /i /c:"%Eingabe%%Delim%" "%Namensliste%"') do ( 
25.
    set "benutzername=%%a" 
26.
    set "vorname=%%b" 
27.
    set "nachname=%%c" 
28.
    set "fullname=%%d" 
29.
	set "gesperrt=%%e" 
30.
31.
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:
01.
KKulp;Karl;Kulp;Karl Kulp;no
Danke für eure Hilfe.
Mitglied: bastla
28.07.2009 um 16:32 Uhr
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
Bitte warten ..
Mitglied: Biber
28.07.2009 um 17:05 Uhr
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
Bitte warten ..
Mitglied: bastla
28.07.2009 um 17:16 Uhr
@Biber
woher denn die benutzte Variable %LEHRER% kommen mag.
Mein Tipp: Zeile 8

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

Grüße
bastla
Bitte warten ..
Mitglied: Peter161
28.07.2009 um 17:18 Uhr
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
Bitte warten ..
Mitglied: Peter161
28.07.2009 um 17:23 Uhr
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.
01.
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
01.
rem Erklärung Gruppe 1 
02.
Anweisungsgruppe1 
03.
rem --------------------- 
04.
rem Erklärung Gruppe 2 
05.
Anweisungsgruppe 2 
06.
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
Bitte warten ..
Mitglied: Peter161
28.07.2009 um 17:25 Uhr
Zitat von bastla:
@Biber
> woher denn die benutzte Variable %LEHRER% kommen mag.
Mein Tipp: Zeile 8

@Peter161
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
Bitte warten ..
Mitglied: bastla
28.07.2009 um 17:41 Uhr
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:
01.
setlocal enabledelayedexpansion 
02.
for /f "tokens=1-5 delims=%Delim%" %%a in ('findstr /b /i /c:"%Eingabe%%Delim%" "%Namensliste%"') do ( 
03.
    set "benutzername=%%a" 
04.
    set "vorname=%%b" 
05.
    set "nachname=%%c" 
06.
    set "fullname=" 
07.
    set "gesperrt=%%e" 
08.
    set "anmeldename=!vorname:~,1!!nachname!" 
09.
)
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 ...
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Grosses Variablen Problem ( Batch) (30)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell funktioniert nicht richtig beim Auslesen der letzten Zeile (5)

Frage von Peter32 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...