snowman25
Goto Top

Wörter in Echo verschwinden - werden gedreht

Seit wann können Wörter in Echos einfach verschwinden?

Hallo liebe Mit-Administratoren\Administratorinnen,

Irgendetwas mache ich mit meinen Echos falsch.
Siehe hier:
@Echo off
ipconfig|findstr /I gateway>%TEMP%\temp.ip
for /F "tokens=2 delims=:" %%P in (%TEMP%\temp.ip) do (  
	Echo %%P>%TEMP%\alpha.ip
	for /F "tokens=4 delims=." %%I in (%TEMP%\alpha.ip) do (  
		if %%I LEQ 2 (
			if x%%I==x1 (
				netsh -f noproxy.conf
				Echo noproxy
			)
			if x%%I==x2 (
				netsh -f norm.conf
				echo norm
			)
			Echo Gateway 172.18.235.%%I wurde angelegt
			Echo Tastendruck zum beenden...
			pause>nul
		) else (
			Echo Falsches Gateway! gefunden: %%P
			Echo Tastendruck zum beenden...
			pause>nul
		)
	)
)
rem del %TEMP%\temp.ip
rem del %TEMP%\alpha.ip
Prompt:
U:\batch\netchange>change.bat
 wurde angelegt235.1
Tastendruck zum beenden...
Es sind keine Steuerzeichen oder sonstiges im Text.
Wo liegt mein Fehler?

Gruß
Snow

Content-Key: 140492

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

Printed on: April 18, 2024 at 08:04 o'clock

Member: bastla
bastla Apr 13, 2010 at 10:36:57 (UTC)
Goto Top
Hallo Snowman!

Ich würde ja darauf tippen, dass unmittelbar vor dem Umleitungszeichen zB die Ziffer 0 steht - dann wird diese als Angabe des Kanals interpretiert ...

Abhilfe schafft das Voranstellen der Umleitung, also etwa
>>%TEMP%\alpha.ip Echo %%P
(oder auch ein Leerzeichen vor dem ">", was man/frau aber öfters vermeiden möchte).

Grüße
bastla
Member: Snowman25
Snowman25 Apr 13, 2010 at 10:50:17 (UTC)
Goto Top
Zitat von @bastla:
Hallo Snowman!

Ich würde ja darauf tippen, dass unmittelbar vor dem Umleitungszeichen zB die Ziffer 0 steht - dann wird diese als Angabe des
Kanals interpretiert ...

Hab mir jetzt die Ausgabe mit Echo on in ein File speichern lassen...
Alle Umleitungen finden auf Kanal 1 statt. Ausserdem würde der Echo dadurch auch nicht so verzogen werden.
Ich bin ratlos...

Gruß
Snow
Mitglied: 77559
77559 Apr 13, 2010 at 13:08:29 (UTC)
Goto Top
Hallo Snow,

wenn ich das richtig sehe, schreibst du mit der %%P Schleife in eine temp Datei
und mit der inneren %%I Schleife liest du gleichzeitig aus derselben?

Über derartige Seiteneffekte würde ich mich dann aber nicht wundern....

Außerdem sind die expliziten Temp Dateien überflüssig, probier dies mal:
@Echo off
for /F "tokens=2 delims=:" %%P in ('ipconfig^|findstr /I gateway') do (  
  Echo.%%P
  for /F "tokens=4 delims=." %%I in ("%%P") do (  
    echo.%%I
    if %%I LEQ 2 (
      if x%%I==x1 (
        netsh -f noproxy.conf
        Echo noproxy
      )
      if x%%I==x2 (
        netsh -f norm.conf
        echo norm
      )
      Echo Gateway 172.18.235.%%I wurde angelegt
      Echo Tastendruck zum beenden...
      pause>nul
    ) else (
      Echo Falsches Gateway! gefunden: %%P
      Echo Tastendruck zum beenden...
      pause>nul
    )
  )
)
rem del %TEMP%\temp.ip
rem del %TEMP%\alpha.ip

Gruß
LotPings

Edit: superfluides % entfernt face-wink
Member: Snowman25
Snowman25 Apr 13, 2010 at 14:21:59 (UTC)
Goto Top
Hallo LotPings,

in zeile 4 ist zwar noch ein % zuviel (in ("%%P%") do statt in ("%%P") do) aber ansonsten funktioniert diese Version einwandfrei. Trotzdem würde ich jetzt gerne wissen, warum denn die mit den temporären Dateien NICHT funkioniert...

Gruß
Snow
Mitglied: 77559
77559 Apr 13, 2010 at 14:38:20 (UTC)
Goto Top
Zitat von @Snowman25:
Trotzdem würde ich jetzt gerne wissen, warum denn die mit den temporären Dateien NICHT funkioniert...
Naja ich hab zwar die CMD.exe nicht programmiert,
aber ich vemute mal das für manche internen Prozesse wie eben auch For-Schleifen eine sekundärer Cmd.exe geöffnet wird und das zeitliche Verhalten hier nicht exakt spezifiert ist. Während der eine Prozess mit der Ausgabe in die temp-Datei noch beschäftigt ist, liest der andere schon daraus, und hier kommt noch eine Besonderheit dazu: Ipconfig erzeugt als Zeilenwechsel die eher ungewöhnliche Komination 0D 0D 0A = CR CR LF und ich weiß aus Erfahrung das es da öfter hapert.

Außerdem ist es ohne Temp Datei deutlich eleganter/effizienter.

Gruß
LotPings
Member: Snowman25
Snowman25 Apr 13, 2010 at 14:53:59 (UTC)
Goto Top
Zitat von @77559:
Zitat von @Snowman25:
Trotzdem würde ich jetzt gerne wissen, warum denn die mit den temporären Dateien NICHT funkioniert...
Naja ich hab zwar die CMD.exe nicht programmiert,
aber ich vemute mal das für manche internen Prozesse wie eben auch For-Schleifen eine sekundärer Cmd.exe geöffnet
wird und das zeitliche Verhalten hier nicht exakt spezifiert ist. Während der eine Prozess mit der Ausgabe in die temp-Datei
noch beschäftigt ist, liest der andere schon daraus.

Die Dateien passen alle. Auch während der Ausführung.

und hier kommt noch eine Besonderheit dazu: Ipconfig erzeugt als Zeilenwechsel die eher ungewöhnliche Kombination
0D 0D 0A = CR CR LF und ich weiß aus Erfahrung das es da öfter hapert.

Das ist kein Argument, da deine Version dann genausowenig funktionieren dürfte.

Außerdem ist es ohne Temp Datei deutlich eleganter/effizienter.

Effizienz in zusammenhang mit netsh? Das braucht allein für 5 zeilen code (2 davon pushd und popd) schon fast 'ne halbe minute.

Gruß
Snow

EDIT:
Grade bemerkt, dass in %I i-wie ein Zeilenumbruch hineinkommt, der auch als solcher interpretiert wird. Sehr eigenartig, aber jetzt auch egal.
Mitglied: 76109
76109 Apr 14, 2010 at 08:27:17 (UTC)
Goto Top
Hallo Snowman!

Also LotPings hat mit dem Hinweis auf Seiteneffekte beim schreiben/lesen schon Recht.

Wenn man bedenkt, das Festplattenzugriffe im millisekunden- und Codeausführung im nanosekundenbereich abläuft ist das nicht verwunderlich. Hier besteht - außer z.B. mit dem Befehl PAUSE - keine Möglichkeit, dem Command zu sagen, warte bis der Datei-Schreibvorgang abgeschlossen ist.

Wenn per Command ein anderes Programm z.B. Findstr aufgerufen wird, dann wartet Command bis das andere Programm beendet ist (Wait Exit). Bei Lese/Schreibvorgängen auf Festplatte läuft das aber anders ab. Hier wird der Echo-Text in einen Buffer geschrieben und ein Interrupt für den StdOut-Treiber ausgelöst (StdOut-File-Handle 1). Der StdOut-Treiber setzt den Schreibvorgang über Ports an den DMA-Controller ab, der mehrere Kanäle (Ports) für unterschiedliche Aufgaben benutzt. D.h. nachdem der StdOut-Treiber den Schreibvorgang an den DMA-Controller abgesetzt hat, kehrt die Codeausführung zum Command zurück und der Vorgang ist für Ihn erledigt und er hat keine Kenntnis darüber, zu welchem Zeitunkt die Daten auf die Festplatte geschrieben werden. Das obliegt allein dem DMA-Controller, der diese Aufgabe eigenständig im Hintergrund ausführt. Ein ähnliches Spiel läuft beim Lesevorgang über den StdIn-Treiber und einen anderen Kanal des DMA-Controllers ab. Hier wird allerdings logischerweise gewartet bis der StdIn-Treiber (Std-File-Handle 0) die Daten in den Buffer geschrieben hat und die Codeausführung kehrt erst dann zum Command zurück.

So in etwa muss man sich den Ablauf vorstellen.

Gruß Dieter
Member: Snowman25
Snowman25 Apr 14, 2010 at 10:16:34 (UTC)
Goto Top
Hallo didi,

wie schon gesagt: Der Inhalt der Dateien zur Ausführung ist weder korrupt noch unvollständig oder sonstiges.
Wenn ich ein entsprechendes Echo in die erste Zeile der Schleife hänge, muss ich ja genau den Inhalt bekommen, der ansonsten an dieser Stelle verarbeitet werden würde. Und dieser stimmt nun mal. Egal ob die Datei davor vorhanden war oder nicht.

Hauptsache ist, dass das Skript jetzt seinen Zweck erfüllt (auch wenn netsh ein wenig schneller sein könnte face-sad) und so auch funktioniert.
Hatte zwar noch 'nen kleinen Denkfehler drin (siehe Zeile 15) aber der ist inzwischen auch ausradiert.

Gruß
Snow