Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Peter161

Peter161 (Level 1) - Jetzt verbinden

28.07.2009, aktualisiert 13:04 Uhr, 4838 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 ..
Ähnliche Inhalte
Batch & Shell

In Batch FINDSTR in Variable und auch noch kuerzen

gelöst Frage von deathwormBatch & Shell2 Kommentare

Hallo! Ich habe folgendes Problem. Beim verschluesseln von Festplatten wird ein Key generiert und dieser in eine TXT Datei ...

Batch & Shell

Verwendung einer gesetzten Variable noch in derselben Eingabezeile

gelöst Frage von EvaEdenBatch & Shell9 Kommentare

Liebe Gemeinde, ich habe ein simples Problem: Ich muss ein paar Befehle in einer Zeile abschicken. Kein Problem, da ...

Batch & Shell

Datei als Variable auslesen und Variable ändern

gelöst Frage von chainsawBatch & Shell1 Kommentar

Hallo Profis, ich komme mit folgendem Problem nicht weiter: In dem Verzeichnis "C:\logfiles" landen bei mir Log-Dateien. Diese Log-Dateien ...

Batch & Shell

Variable in TextDatei auslesen

gelöst Frage von arvaxtrBatch & Shell5 Kommentare

Hallo Leute, ich habe eine TextDatei, in der eine Benutzervariable steht: %MyVar% ist als Benutzervariable in den Umgebungsvariablen definiert. ...

Neue Wissensbeiträge
Erkennung und -Abwehr

Ups: Einfaches Nullzeichen hebelte den Anti-Malware-Schutzt in Windows 10 aus

Information von kgborn vor 7 StundenErkennung und -Abwehr

Windows 10 ist das sicherste Windows aller Zeiten, wie Microsoft betont. Insidern ist aber klar, das es da Lücken, ...

Windows 10

Windows 10 on ARM: von Microsoft entfernte Info - Klartext, was nicht geht

Information von kgborn vor 9 StundenWindows 10

Windows 10 on ARM ist ja eine neue Variante, die Microsoft im Verbund mit Geräteherstellern am Markt etablieren will. ...

Microsoft
TV-Tipp: Das Microsoft-Dilemma
Information von kgborn vor 9 StundenMicrosoft7 Kommentare

Aktuell gibt es in Behörden und in Firmen eine fatale Abhängigkeit von Microsoft und dessen Produkten. Planlos agieren die ...

Windows 10
Zero-Day-Lücke in Microsoft Edge
Information von kgborn vor 2 TagenWindows 10

In Microsofts Edge-Browser klafft wohl eine nicht geschlossene (0-Day) Sicherheitslücke im Just In Time Compiler (JIT Compiler) für Javascript. ...

Heiß diskutierte Inhalte
Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1026 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Firewall
RB2011 Firewall Rule eine bestimmte Mac oder IP Adresse nicht zu blockieren
Frage von lightmanFirewall15 Kommentare

Hallo liebes Forum mit ihren Spezialisten. Ich habe meine Firewall so konfiguriert das kein Endgerät ohne meine Speziellen Erlaubnis ...

Humor (lol)
Was könnte man mit einem Server machen? Idee gesucht
Frage von 2SeitenHumor (lol)15 Kommentare

Hey Zusammen Ich habe einen alten HP G2 Rackserver zu Hause rumliegen. 28GB Ram, 1xAMD Prozi mit etwa 2GHz. ...

Webbrowser
Welcher Browser ist der Beste?
Frage von justtinWebbrowser13 Kommentare

Hallo Leute Ich habe eine interessante Frage. Mich wurde mal interessieren welcher Browser ist eure meinung nach der beste? ...