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:
Prompt:
Es sind keine Steuerzeichen oder sonstiges im Text.
Wo liegt mein Fehler?
Gruß
Snow
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
U:\batch\netchange>change.bat
wurde angelegt235.1
Tastendruck zum beenden...
Wo liegt mein Fehler?
Gruß
Snow
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 140492
Url: https://administrator.de/contentid/140492
Ausgedruckt am: 16.11.2024 um 07:11 Uhr
8 Kommentare
Neuester Kommentar
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
(oder auch ein Leerzeichen vor dem ">", was man/frau aber öfters vermeiden möchte).
Grüße
bastla
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
Grüße
bastla
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:
Gruß
LotPings
Edit: superfluides % entfernt
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
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,Trotzdem würde ich jetzt gerne wissen, warum denn die mit den temporären Dateien NICHT funkioniert...
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
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
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