svenguenter
Goto Top

Variable wird nicht erkannt

Hallo hier mein Problem.

Ich habe mehrere batchdateien. Die eine sieht foglendermaßen aus

echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Start localLogonscript >> c:\Domainscripte.log
REM Prüfen ob der erste Domaincontroller vorhanden ist. Falls Ja wird direkt die Batch verlassen.
REM Falls der Ping erfolglos ist wird der 
REM zweite Domaincontroller gesucht


FOR /F "tokens=3 delims=," %%i IN ('ping 172.xxx.xxx.xxx -w 128 -n 1') DO SET srveins=%%i  

echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% 1 >> c:\Domainscripte.log
SET srveins=%srveins:~1%

echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% 2 >> c:\Domainscripte.log

FOR /F "tokens=3 delims= " %%i IN ("%srveins%") DO SET pingergebniseins=%%i  
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% 3 >> c:\Domainscripte.log

if not "%pingergebniseins%" =="1" GoTo normalende  
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% 4 >> c:\Domainscripte.log

REM Prüfen ob der zweite Domaincontroller vorhanden ist. Falls Ja wird direkt die Batch verlassen.
REM Falls der Ping erfolglos ist wird der
REM wird die Batch mit der Fehlersprungmarke verlassen.
FOR /F "tokens=3 delims=," %%i IN ('ping 172.xxx.xxx.xxx -w 128 -n 1') DO SET srvzwei=%%i  
SET srvzwei=%srvzwei:~1%
FOR /F "tokens=3 delims= " %%i IN ("%srvzwei%") DO SET pingergebniszwei=%%i  
if "%pingergebniszwei%" =="1" GoTo verloren  
goto normalende

:verloren
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Kein Domaincontroller gefunden >> c:\Domainscripte.log
goto ende

:normalende
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Starte DomainLogonofflogScript >> c:\Domainscripte.log
CALL \\hemmelrath.kli\SysVol\hemmelrath.kli\scripts\Logonofflog.cmd -1 \\xxxxxxx\IT$\ADSLogins\
:ende
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Ende localLogonscript >> c:\Domainscripte.log

Dieses Script läuft auf allen Rechner. Auch soweit ohne Probleme.
Das Problem ist auf meinem Rechner läuft es nicht und stürzt ab. Und zwar wird die shell geschlossen wenn ich eine aufmache und die Batch von Hand starte.
Führe ich pausen ein sehe ich das bereits bei der ersten For Schleife die batch abstürzt.

Führe ich die For schleife alleine aus kommt folgende fehlermeldung
FOR /F "tokens=3 delims=," %%i IN ('ping 172.xxx.xxx.xxx -w 128 -n 1') DO SET srveins=%%i  
"%%i" ist syntaktisch an dieser Stelle nicht verarbeitbar.  

Kann mir wer helfen??

Content-ID: 91051

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

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

Biber
Biber 01.07.2008 um 19:11:07 Uhr
Goto Top
Moin SvenGuenter,

beispielsweise auf wikipedia kannst Du das KISS-Prinzip nachlesen.
Frei übersetzt in etwa: "Keep it simple, Sven. "

Wenn Du über eine mehrzeilige Ping-Ausgabe, die je nach Rechner, Land, OS-Version und Ping-Ergebnis unterschiedlich sein kann, mit je 2 FOR/F-Anweisungen drüberläufst und jeweils das 3. Token der letzten Zeile (mal mit Space, mal mit Komma getrennt) rausfieselst.... das ist nun mal fehlerträchtig.

Also mein Tipp: De-Eskalation. Fehlervermeidung statt Fehlersuche.
Weniger Code=weniger Kot.
Das Ping-Utility liefert DEFINITIV in deutsch, englisch, italienisch, Oldenburger Platt und überhaupt immer eine Zeile mit dem möglichen Suchwort "TTL" zurück, wenn der angePINGte Rechner wenigstens winkt oder blinzelt.
Wenn kein Rechner antwortet, kommt (egal welche Sprache, welches OS, welcher Fehler) kein Suchwort "TTL" zurück.

Wenn Du diese ganzen mehrstufigen "FOR/F...token=.." in ('ping...') Do SET..." ein bisschen eindampfst, bleibt übrig:
...
:DCxCheck
ping 172.xxx.yyy.zzz ...|find "TTL" >nul  
If errorlevel 1 goto :DCxAntwortetNicht
:: logisches ELSE
goto :DCxAntwortet_AllesPrima
....
:: entsprechend für DCy (zweiten Domaincontroller) in grün.

Ich denke, wenn dadurch 98% der FOR/F und SET und IF ...==-Konstrukte wegfallen, könnten auch 98% der Fehlerquellen verschwunden sein.

Grüße
Biber
SvenGuenter
SvenGuenter 02.07.2008 um 09:10:36 Uhr
Goto Top
Super klappt. Naja wie gesagt warum einfach wenn es auch kompliziert geht.

Danke für den Tipp.

Gruß Sven
Biber
Biber 02.07.2008 um 09:16:31 Uhr
Goto Top
Moin SvenGuenter,

wenn Du magst, dann poste doch noch das eingedampfte Skriptchen.

Ich war dazu gestern zu schreibfaul bzw. dachte, Du musst es ja ohnehin machen..

Danach kann ich den Thread guten Gewissens schliessen.

Danke dafür
Biber
SvenGuenter
SvenGuenter 02.07.2008 um 09:57:15 Uhr
Goto Top
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Start localLogonscript >> c:\Domainscripte.log
REM Prüfen ob der erste Domaincontroller vorhanden ist. Falls Ja wird direkt die Batch verlassen.
REM Falls der Ping erfolglos ist wird der 
REM zweite Domaincontroller gesucht
ping 172.xxx.yyy.zzz|find "TTL" >nul   
If errorlevel 1 goto zweiterversuch

goto normalende

:zweiterversuch
ping 172.xxx.yyy.zzz|find "TTL" >nul   

If errorlevel 1 goto verloren

goto normalende

:verloren
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Kein Domaincontroller gefunden >> c:\Domainscripte.log
goto ende

:normalende
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Starte DomainLogonofflogScript >> c:\Domainscripte.log
CALL \\xxx.kli\SysVol\xxx.kli\scripts\Logonofflog.cmd -1 \\filesrv01\IT$\ADSLogins\
:ende
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Ende localLogonscript >> c:\Domainscripte.log

Was mich aber immer noch wundert ist das die Variable %%i zum Absturz der Bash führt bzw. das die Syntax von heute auf morgen auf einmal falsch sein soll obwohl sie vorher wochenlang funktionierte.


Gruß

Sven
Biber
Biber 02.07.2008 um 15:02:22 Uhr
Goto Top
Moin SvenGuenter,

danke fürs prompte Feedback - so stelle ich mir ein funktionierendes Forum vor.

Was mich aber immer noch wundert ist das die Variable %%i zum Absturz der Bash führt bzw. das die Syntax von heute auf morgen auf einmal falsch sein soll obwohl sie vorher wochenlang funktionierte.

Na ja, der Fehler würde sich schon finden lassen (wenn Du mal eine blutjunge rothaarige Praktikantin zu Seite gestellt bekommst und nicht so recht weißt, wie Du sie während der Bürozeiten ruhigstellen kannst)...

Irgendeines der aufgerufenen PINGs liefert -immer oder manchmal- eine Ausgabe zurück, bei der eben keine einzige Zeile dabei ist, die ein drittes Token enthält (wenn die Delimiter Kommas sind). So was in der Art.

Und hey - niemand hat je zugesichert, dass PING.exe immer etwas zurückliefern soll, dass 3 Spalten hat (bei Erfolg und bei Fehler). Da muss ich mal Bills Bande in Schutz nehmen.

Andererseits: der Grund, weshalb wir bei Ping.exe-Aufrufen immer den Rückgabetext und nicht den Rückgabe-Errorlevel abfragen ist ja:
Es kommt beim Ping-Utility eben nicht 0 bei AllesPrima und ungleich 0 bei InnerGrütze zurück.

Ich setze den Beitrag trotzdem mal auf "erledigt".

Grüße
Biber
SvenGuenter
SvenGuenter 02.07.2008 um 17:35:04 Uhr
Goto Top
Jo danke auch Dir für die prompte Antwort.

Aber ich denke das das Problem weniger an der Returnwert sondern eher an meinem System liegt.
Grund für die Annahme:
Nur mein PC hat diesen Fehler alle anderen PC's laufen mit dem Script einwandfrei.
Wenn ich pausen einbaue sehe ich auch das der Ping klappt. Trotzdem immer die Fehlermeldung %%i ist an dieser Stelle syntatktisch nicht richtig.
Wie gesagt nur bei mir.
Immerhin laufen die Scripte nun wieder aber trotzdem will ich gerne wissen warum er es nicht bei mir macht. Ich werde noch weiter googlen und falls ich was finden sollte poste ich es einfach.

Schönen Tag noch

Gruß

SvenGuenter
Biber
Biber 02.07.2008 um 18:07:36 Uhr
Goto Top
Moin SvenGuenter,

ich wäre der Letzte, der Dich vom Googlen nach blutjungen rothaarigen PraktikantInnen abhalten würde, ehrlich, aber die Ursache für den Fehler an einem konkreten Rechner finden wir hier gemeinsam schneller.

Dann ändere in Deinem zuerst geposteten Schnipsel diese Zeilen ...
FOR /F "tokens=3 delims=," %%i IN ('ping 172.xxx.xxx.xxx -w 128 -n 1') DO SET srveins=%%i   
...zum Debuggen so um:
ping 172.xxx.xxx.xxx -w 128 -n 1 >d:\temp\PingProtDC1.txt
FOR /F "tokens=3 delims=," %%i IN (d:\temp\PingProtDC1.txt) DO SET "srveins=%%i"   
...

In den Ping-Bildschirm-Ausgaben können wir dann in Ruhe graben, was beim letzten Mal abgekachelt ist.

Grüße
Biber
SvenGuenter
SvenGuenter 03.07.2008 um 10:11:34 Uhr
Goto Top
Hi Biber,
danke für deine angebote Hilfe die ich sehr gerne annehme.
Hier der Snippet
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

d:\Dokumente und Einstellungen\guenter>c:

C:\>test.cmd

C:\>ping 172.xxx.yyy.zzz -w 128 -n 1   1>d:\temp\PingProtDC1.txt
C:\>FOR /F "tokens=3 delims=," %i IN (d:\temp\PingProtDC1.txt) DO SET "srveins=%  
i"  

C:\>SET "srveins= Verloren = 0 (0% Verlust)"  

" \>SET "srveins= Mittelwert = 0ms  

C:\>
SvenGuenter
SvenGuenter 03.07.2008 um 11:25:04 Uhr
Goto Top
So als anstoss bei der Fehlersuche.
Bei folgendem Code bekomme ich das:
C:\>FOR /F "tokens=3 delims=," %i IN ("Ping 172.20.4.1 -w 128 -n 1") DO SET srve  
ins=%i

C:\>SET srveins=1

Bei
FOR /F "tokens=3 delims=," %%i IN ('Ping 172.xxx.yyy.zzz -w 128 -n 1') DO SET srveins =%%i  
schließt die Commandozeile und ich bekomme den fehler

Änderungen war die doppelten in die einfachen Hochkommata. Problem ist, in allen Scripten sind die einfachen Hochkommata. Und das nächste für mich unerklärliche Problem ist, dass das Script mal bei mir einwandfrei gelaufen ist.


Gruß

Sven
Biber
Biber 03.07.2008 um 22:12:59 Uhr
Goto Top
Moin Sven,

gute und schlechte Nachrichten:
Ich kann den Fehler reproduzieren und auch umgehen helfen.
Verstehen allerdings kann ich es nicht.

Zum Reproduzieren unter Win XP SP2:
Am Cmd-Prompt mal eine Datei noerr.txt erzeugen:
ping localhost>noerr.txt
...und die mit Deiner FOR/F-Anweisung durchflöhen.
>for /f "tokens=3 delims==" %i in (noerr.txt) do @echo Set myvar=%i  
Set myvar=128
Set myvar=128
Set myvar=128
Set myvar=128
Set myvar= 4, Verloren
Set myvar= 0ms, Mittelwert

(=22:00:43  D:\temp=)
>for /f "tokens=3 delims==" %i in (noerr.txt) do @echo Set "myvar=%i"  
"et "myvar=128  
"et "myvar=128  
"et "myvar=128  
"et "myvar=128  
Set "myvar= 4, Verloren "  
Set "myvar= 0ms, Mittelwert "  

(=22:00:48  D:\temp=)
>for /f "tokens=3 delims=," %i in (noerr.txt) do @echo Set myvar=%i  
Set myvar= Verloren = 0 (0% Verlust)
Set myvar= Mittelwert = 0ms

(=22:01:17  D:\temp=)
>for /f "tokens=3 delims=," %i in (noerr.txt) do @echo Set "myvar=%i"  
Set "myvar= Verloren = 0 (0% Verlust)"  
"et "myvar= Mittelwert = 0ms  
Wie zu sehen ist, wird (unabhängig vom Delimiter ",", den ich zuerst im Verdacht hatte) die SET-Anweisung verstümmelt, wenn das SET von einem Anführungszeichen gefolgt wird. (beide SET "myvar =%i"-Versuche scheitern.).

Muss (eventuell) daran liegen, dass in der Pingausgabe ein <TAB> am Anfang der Zeile steht statt eine Anzahl Leerzeichen..*spekulier* ...*rumrate*...

Es deutet ja jedenfalls darauf hin, dass die Länge der Inputzeile und der berechnete Offset des Tokens bei M$ irgendwie durcheinanderkommen.
Oder es ist ein anderes nicht erkennbares Zeichen in der NoErr.txt.

Ich werde es mal im Auge behalten.

Grüße
Biber
[Edit 4.7.2008]
Nachtrag: Dieses Fehl-Verhalten ist wirklich beschränkt auf bzw. abhängig von der Ausgabe des Ping-Utilities.
Da wird Dreck geliefert, der nicht den normalen Erwartungen an eine Plain-Text-Ausgabe entspricht.

Folgendes sollte sich auch auf Euren Rechnern nachstellen lassen:
>for /f "delims=" %i in ('find "Ant" noerr.txt') do @echo test1 %i test2  
test1 ---------- NOERR.TXT test2
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128
--- bzw-
>>for /f "delims=" %i in ('ping localhost^|find "Ant"') do @echo test1 %i test2  
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128

Bei anderen Texten/Textdateien ist dieses Verhalten nicht reproduzierbar.

Und nein, ich habe mein Ping-Utilities nicht von einem dubiosen estnischen Fileserver herunterladen und nein, es wird nicht als infiziert angezeigt, sondern ist das Original aus dem unerschöpflichen Fundus des sympathischen Weltmarktführers.
[/Edit]
Biber
Biber 05.07.2008 um 18:02:07 Uhr
Goto Top
So,

hoffentlich letzte Ergänzung zu diesem Ping-Ausgabetext.

Bei normalem Plaintext/Textdateien unter Dos/Windows-Systemen wird jede Zeile mit den Zeichen
  • "Carriage Return" und "LineFeed",
  • bekannt auch als CR/LF oder auch als
  • Chr(10) und Chr(13)
abgeschlossen.

Der ausgegebene Bildschirm-Text des Ping-Utilities endet aber mit CR+CR+LF, was große Grütze ist.

Führt bei jeglicher Stringverkettung unter dem CMD/im Batch zu den beschriebenen Effekten. Denn dann wird der gesamte Zeileninhalt ausschließlich CRLF als Text weiterverarbeitet... und der schließt das überflüssige CR (das erste Zeichen von CR+Cr+LF) mit ein.
Dieses ist aber unter dem CMD gar kein gültiges Zeichen innerhalb eines Textes/einer Variablen.

Na ja, wie dem auch sei, die ursprüngliche Empfehlung zu ursprünglichen Frage war ja:
Mach es ohne FOR/F-Konstrukte.
Diese Empfehlung erhalte ich aufrecht.

Grüße
Biber
SvenGuenter
SvenGuenter 07.07.2008 um 12:11:16 Uhr
Goto Top
Hi Biber,

danke für deine Hilfe.
Werde nun wohl oder übel alle Skripte ändern die mit der For schleife arbeiten.


Gruß

Sven
Biber
Biber 07.07.2008 um 12:54:56 Uhr
Goto Top
Moin Sven,

Werde nun wohl oder übel alle Skripte ändern die mit der For schleife arbeiten.
Echt? Machst Du das selbst?
Ich lasse das immer durch einen Batch erledigen.... <grins>

Ich setze dann mal wieder den Beitrag auf "Beantwortet".

Grüße
Biber