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
GELÖST

Variable wird nicht erkannt

Frage Entwicklung Batch & Shell

Mitglied: SvenGuenter

SvenGuenter (Level 1) - Jetzt verbinden

01.07.2008, aktualisiert 07.07.2008, 5369 Aufrufe, 13 Kommentare

Hallo hier mein Problem.

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

01.
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Start localLogonscript >> c:\Domainscripte.log 
02.
REM Prüfen ob der erste Domaincontroller vorhanden ist. Falls Ja wird direkt die Batch verlassen. 
03.
REM Falls der Ping erfolglos ist wird der  
04.
REM zweite Domaincontroller gesucht 
05.
 
06.
 
07.
FOR /F "tokens=3 delims=," %%i IN ('ping 172.xxx.xxx.xxx -w 128 -n 1') DO SET srveins=%%i 
08.
 
09.
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% 1 >> c:\Domainscripte.log 
10.
SET srveins=%srveins:~1% 
11.
 
12.
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% 2 >> c:\Domainscripte.log 
13.
 
14.
FOR /F "tokens=3 delims= " %%i IN ("%srveins%") DO SET pingergebniseins=%%i 
15.
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% 3 >> c:\Domainscripte.log 
16.
 
17.
if not "%pingergebniseins%" =="1" GoTo normalende 
18.
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% 4 >> c:\Domainscripte.log 
19.
 
20.
REM Prüfen ob der zweite Domaincontroller vorhanden ist. Falls Ja wird direkt die Batch verlassen. 
21.
REM Falls der Ping erfolglos ist wird der 
22.
REM wird die Batch mit der Fehlersprungmarke verlassen. 
23.
FOR /F "tokens=3 delims=," %%i IN ('ping 172.xxx.xxx.xxx -w 128 -n 1') DO SET srvzwei=%%i 
24.
SET srvzwei=%srvzwei:~1% 
25.
FOR /F "tokens=3 delims= " %%i IN ("%srvzwei%") DO SET pingergebniszwei=%%i 
26.
if "%pingergebniszwei%" =="1" GoTo verloren 
27.
goto normalende 
28.
 
29.
:verloren 
30.
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Kein Domaincontroller gefunden >> c:\Domainscripte.log 
31.
goto ende 
32.
 
33.
:normalende 
34.
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Starte DomainLogonofflogScript >> c:\Domainscripte.log 
35.
CALL \\hemmelrath.kli\SysVol\hemmelrath.kli\scripts\Logonofflog.cmd -1 \\xxxxxxx\IT$\ADSLogins\ 
36.
:ende 
37.
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
01.
FOR /F "tokens=3 delims=," %%i IN ('ping 172.xxx.xxx.xxx -w 128 -n 1') DO SET srveins=%%i 
02.
"%%i" ist syntaktisch an dieser Stelle nicht verarbeitbar.
Kann mir wer helfen??
Mitglied: Biber
01.07.2008 um 19:11 Uhr
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:
01.
... 
02.
:DCxCheck 
03.
ping 172.xxx.yyy.zzz ...|find "TTL" >nul 
04.
If errorlevel 1 goto :DCxAntwortetNicht 
05.
:: logisches ELSE 
06.
goto :DCxAntwortet_AllesPrima 
07.
.... 
08.
:: 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
Bitte warten ..
Mitglied: SvenGuenter
02.07.2008 um 09:10 Uhr
Super klappt. Naja wie gesagt warum einfach wenn es auch kompliziert geht.

Danke für den Tipp.

Gruß Sven
Bitte warten ..
Mitglied: Biber
02.07.2008 um 09:16 Uhr
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
Bitte warten ..
Mitglied: SvenGuenter
02.07.2008 um 09:57 Uhr
01.
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Start localLogonscript >> c:\Domainscripte.log 
02.
REM Prüfen ob der erste Domaincontroller vorhanden ist. Falls Ja wird direkt die Batch verlassen. 
03.
REM Falls der Ping erfolglos ist wird der  
04.
REM zweite Domaincontroller gesucht 
05.
ping 172.xxx.yyy.zzz|find "TTL" >nul  
06.
If errorlevel 1 goto zweiterversuch 
07.
 
08.
goto normalende 
09.
 
10.
:zweiterversuch 
11.
ping 172.xxx.yyy.zzz|find "TTL" >nul  
12.
 
13.
If errorlevel 1 goto verloren 
14.
 
15.
goto normalende 
16.
 
17.
:verloren 
18.
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Kein Domaincontroller gefunden >> c:\Domainscripte.log 
19.
goto ende 
20.
 
21.
:normalende 
22.
echo %DATE% %TIME% %COMPUTERNAME% %SESSIONNAME% Starte DomainLogonofflogScript >> c:\Domainscripte.log 
23.
CALL \\xxx.kli\SysVol\xxx.kli\scripts\Logonofflog.cmd -1 \\filesrv01\IT$\ADSLogins\ 
24.
:ende 
25.
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
Bitte warten ..
Mitglied: Biber
02.07.2008 um 15:02 Uhr
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
Bitte warten ..
Mitglied: SvenGuenter
02.07.2008 um 17:35 Uhr
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
Bitte warten ..
Mitglied: Biber
02.07.2008 um 18:07 Uhr
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 ...
01.
FOR /F "tokens=3 delims=," %%i IN ('ping 172.xxx.xxx.xxx -w 128 -n 1') DO SET srveins=%%i 
...zum Debuggen so um:
01.
ping 172.xxx.xxx.xxx -w 128 -n 1 >d:\temp\PingProtDC1.txt 
02.
FOR /F "tokens=3 delims=," %%i IN (d:\temp\PingProtDC1.txt) DO SET "srveins=%%i"  
03.
...
In den Ping-Bildschirm-Ausgaben können wir dann in Ruhe graben, was beim letzten Mal abgekachelt ist.

Grüße
Biber
Bitte warten ..
Mitglied: SvenGuenter
03.07.2008 um 10:11 Uhr
Hi Biber,
danke für deine angebote Hilfe die ich sehr gerne annehme.
Hier der Snippet
01.
Microsoft Windows XP [Version 5.1.2600] 
02.
(C) Copyright 1985-2001 Microsoft Corp. 
03.
 
04.
d:\Dokumente und Einstellungen\guenter>c: 
05.
 
06.
C:\>test.cmd 
07.
 
08.
C:\>ping 172.xxx.yyy.zzz -w 128 -n 1   1>d:\temp\PingProtDC1.txt 
09.
C:\>FOR /F "tokens=3 delims=," %i IN (d:\temp\PingProtDC1.txt) DO SET "srveins=% 
10.
i" 
11.
 
12.
C:\>SET "srveins= Verloren = 0 (0% Verlust)" 
13.
 
14.
" \>SET "srveins= Mittelwert = 0ms 
15.
 
16.
C:\>
Bitte warten ..
Mitglied: SvenGuenter
03.07.2008 um 11:25 Uhr
So als anstoss bei der Fehlersuche.
Bei folgendem Code bekomme ich das:
01.
C:\>FOR /F "tokens=3 delims=," %i IN ("Ping 172.20.4.1 -w 128 -n 1") DO SET srve 
02.
ins=%i 
03.
 
04.
C:\>SET srveins=1
Bei
01.
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
Bitte warten ..
Mitglied: Biber
03.07.2008 um 22:12 Uhr
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:
01.
ping localhost>noerr.txt
...und die mit Deiner FOR/F-Anweisung durchflöhen.
01.
>for /f "tokens=3 delims==" %i in (noerr.txt) do @echo Set myvar=%i 
02.
Set myvar=128 
03.
Set myvar=128 
04.
Set myvar=128 
05.
Set myvar=128 
06.
Set myvar= 4, Verloren 
07.
Set myvar= 0ms, Mittelwert 
08.
 
09.
(=22:00:43  D:\temp=) 
10.
>for /f "tokens=3 delims==" %i in (noerr.txt) do @echo Set "myvar=%i" 
11.
"et "myvar=128 
12.
"et "myvar=128 
13.
"et "myvar=128 
14.
"et "myvar=128 
15.
Set "myvar= 4, Verloren " 
16.
Set "myvar= 0ms, Mittelwert " 
17.
 
18.
(=22:00:48  D:\temp=) 
19.
>for /f "tokens=3 delims=," %i in (noerr.txt) do @echo Set myvar=%i 
20.
Set myvar= Verloren = 0 (0% Verlust) 
21.
Set myvar= Mittelwert = 0ms 
22.
 
23.
(=22:01:17  D:\temp=) 
24.
>for /f "tokens=3 delims=," %i in (noerr.txt) do @echo Set "myvar=%i" 
25.
Set "myvar= Verloren = 0 (0% Verlust)" 
26.
"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:
01.
>for /f "delims=" %i in ('find "Ant" noerr.txt') do @echo test1 %i test2 
02.
test1 ---------- NOERR.TXT test2 
03.
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128 
04.
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128 
05.
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128 
06.
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128 
07.
--- bzw- 
08.
>>for /f "delims=" %i in ('ping localhost^|find "Ant"') do @echo test1 %i test2 
09.
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128 
10.
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128 
11.
 test2Antwort von 127.0.0.1: Bytes=32 Zeit<1ms TTL=128 
12.
 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]
Bitte warten ..
Mitglied: Biber
05.07.2008 um 18:02 Uhr
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
Bitte warten ..
Mitglied: SvenGuenter
07.07.2008 um 12:11 Uhr
Hi Biber,

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



Gruß

Sven
Bitte warten ..
Mitglied: Biber
07.07.2008 um 12:54 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (32)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...