Batch Script - Bei echo Umleitung in Datei werden 0 und 1 gelöscht?
Hallo, ich habe folgendes Problem.
wenn ich diese Skript ausführe (scannt die Datei Zeilenweise und ersetzt eine String an einer bestimmten Stelle, überschreibt dann die alte Datei):
dann werden in jeder Zeile die mit =1 oder =0 endet, die Zahl gelöscht.
Wenn ich das Skript an dieser Stelle ändere:
dann werden alle Zeichen angezeigt aber ich habe ein unerwünschtes Leerzeichen an jedem Zeilenende.
Die Zeichen werden auch nur beim schreiben in die Datei entfernt, wenn ich mir per echo die Zeilen im Terminal anzeigen lasse werden alle Zeichen angezeigt.
bye martin
P.S.: wie kann ich in der for Schleife die Leerzeilen aus der Original-Datei mitnehmen?
wenn ich diese Skript ausführe (scannt die Datei Zeilenweise und ersetzt eine String an einer bestimmten Stelle, überschreibt dann die alte Datei):
set source=%allusersprofile%\Anwendungsdaten\Microsoft\Network\Connections\Pbk
for /F "tokens=*" %%a in ('type "%source%\aventail.pbk"') do (call :replace "%%a")
goto end
:replace
set line=%~1
set line=%line:url.de=199.199.199.199%
echo %line%>>"%source%\aventail_0.pbk"
goto end2
:end
move /Y "%source%\aventail_0.pbk" "%source%\aventail.pbk"
exit
:end2
dann werden in jeder Zeile die mit =1 oder =0 endet, die Zahl gelöscht.
Wenn ich das Skript an dieser Stelle ändere:
echo %line% >>"%source%\aventail_0.pbk"
Die Zeichen werden auch nur beim schreiben in die Datei entfernt, wenn ich mir per echo die Zeilen im Terminal anzeigen lasse werden alle Zeichen angezeigt.
bye martin
P.S.: wie kann ich in der for Schleife die Leerzeilen aus der Original-Datei mitnehmen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 73567
Url: https://administrator.de/contentid/73567
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
5 Kommentare
Neuester Kommentar
Ich versuchs mal zu erklären, obwohl ich das nicht gut kann.
Es gibt Zwei Umleitungsmöglichkeiten für eine Ausgabe.
Einmal die Standardausgabe, z.B.
Wird nichts vor der klammer angegeben wird 1 verwendet.
Hast du jetzt aber in der Variable %line% z.B. 1232 stehen wird die letzte 2 als umleiotung für den Fehler interpretiert. nur das bei echo kein Fehler entsteht, und so auch ncihts geschrieben wird.
Indem eine klammer um das echo %line% gemacht wird und danach die umleitung expliziet von 1 in die Datei wird alles was in der Klammer als ausgabe steht umgeleitet.
Ich hoffe das war halbwegs verständlich erklärt. Sorry besser kan ichs nicht.
miniversum
Es gibt Zwei Umleitungsmöglichkeiten für eine Ausgabe.
Einmal die Standardausgabe, z.B.
echo bla 1>Datei.txt
und die Ausgabe bei einem Fehlerecho bla 2>Datei.txt
Wird nichts vor der klammer angegeben wird 1 verwendet.
Hast du jetzt aber in der Variable %line% z.B. 1232 stehen wird die letzte 2 als umleiotung für den Fehler interpretiert. nur das bei echo kein Fehler entsteht, und so auch ncihts geschrieben wird.
Indem eine klammer um das echo %line% gemacht wird und danach die umleitung expliziet von 1 in die Datei wird alles was in der Klammer als ausgabe steht umgeleitet.
Ich hoffe das war halbwegs verständlich erklärt. Sorry besser kan ichs nicht.
miniversum
Moin mrt181,
willkommen im Forum.
Zu Deiner Hauptfrage ("0,1...4 vor einem Pipe-Symbol wie > oder >>" ):
Die 0 und 1 werden nicht verschluckt, sondern als Quellkanal betrachtet, also als eigentliche "Leitung", auf dem der Text ankommt. Das ist okay so.
Kleiner Trockentest. Eine Zeile am CMD-Prompt und deren Ausgabe:
So war es geplant und so hat es auch die CMD.exe verstanden.
Wenn ich aber ein Umleitungssymbol dranhänge in eine Datei oder auch nur eine Umleitung auf den Bildschirm (der ja auch der Default ist):
Upps, die "1" ist verschwunden.
Weil: Die CMD.exe interpretiert "führe den echo-Befehl aus und leite alles, was auf Kanal 1 von diesem Befehl gesendet wird um nach whereever".
Das ist auch okay so. Ehrlich.
Aber so genau wolltest Du es vielleicht gar nicht wissen. Deshalb jetzt die Umgehungsmöglichkeiten:
1) setze explizit an jede Stelle, an der bei dir bisher ">>%meinepbk%" steht ein "1>>%meinepbk%. Sieht Shice aus, aber reicht.
2) Vertrau mir und drehe einfach die Reihenfolge um:
Zur Zusatzfrage "Leerzeilen erhalten".
Die FOR /F-Anweisungen "ignorieren" Leerzeilen. No way out.
Aber Du kannst Dafür sorgen, das keine Leerzeilen kommen wenn Du
STATT 'type "%source%\aventail.pbk"'
NEU 'findstr /n . "%source%\aventail.pbk"'
in der Klammer verwendest und die FOR-Anweisung so veränderst:
JETZT:
NEU:
[ungetestet]
Grüße
Biber
[Edit]
Sorry, nicht gesehen, dass inzwischen schon so viel passiert ist... eine Bekannte hatte kurz angerufen, nachdem ich begonnen hatte, meine Antwort zu schreiben.
[/Edit]
[Edit2] Bullshit. Die Änderung zu 2) sollte so aussehen:
[/Edit2]
[Edit3]Ist immer noch alles Unsinn - eine Lösung steht in diesem mrt181-Beitrag[/Edit3]
willkommen im Forum.
Zu Deiner Hauptfrage ("0,1...4 vor einem Pipe-Symbol wie > oder >>" ):
Die 0 und 1 werden nicht verschluckt, sondern als Quellkanal betrachtet, also als eigentliche "Leitung", auf dem der Text ankommt. Das ist okay so.
Kleiner Trockentest. Eine Zeile am CMD-Prompt und deren Ausgabe:
@echo test mehrtest 1
test mehrtest 1
Wenn ich aber ein Umleitungssymbol dranhänge in eine Datei oder auch nur eine Umleitung auf den Bildschirm (der ja auch der Default ist):
@echo test mehrtest 1>con
test mehrtest
@echo test mehrtest 1>test.txt
type test.txt
test mehrtest
Weil: Die CMD.exe interpretiert "führe den echo-Befehl aus und leite alles, was auf Kanal 1 von diesem Befehl gesendet wird um nach whereever".
Das ist auch okay so. Ehrlich.
Aber so genau wolltest Du es vielleicht gar nicht wissen. Deshalb jetzt die Umgehungsmöglichkeiten:
1) setze explizit an jede Stelle, an der bei dir bisher ">>%meinepbk%" steht ein "1>>%meinepbk%. Sieht Shice aus, aber reicht.
2) Vertrau mir und drehe einfach die Reihenfolge um:
>>"%source%\aventail_0.pbk" echo %line%
Zur Zusatzfrage "Leerzeilen erhalten".
Die FOR /F-Anweisungen "ignorieren" Leerzeilen. No way out.
Aber Du kannst Dafür sorgen, das keine Leerzeilen kommen wenn Du
STATT 'type "%source%\aventail.pbk"'
NEU 'findstr /n . "%source%\aventail.pbk"'
in der Klammer verwendest und die FOR-Anweisung so veränderst:
JETZT:
for /F "tokens=*" %%a in ('type "%source%\aventail.pbk"') do (call :replace "%%a")
for /F "delims=: tokens=1,2*" %%a in ('findstr /n . "%source%\aventail.pbk"') do call :replace "%%b"
Grüße
Biber
[Edit]
Sorry, nicht gesehen, dass inzwischen schon so viel passiert ist... eine Bekannte hatte kurz angerufen, nachdem ich begonnen hatte, meine Antwort zu schreiben.
[/Edit]
[Edit2] Bullshit. Die Änderung zu 2) sollte so aussehen:
for /F "delims=: tokens=2*" %%a in ('findstr /n . "%source%\aventail.pbk"') do call :replace "%%a"
...
:replace
:: Sonderbehandlung "leerer" Parameter
If "%~1"=="" (
echo.>>"%source%\aventail_0.pbk"
) ELSE (
set line=%~1
set line=%line:url.de=199.199.199.199%
>>"%source%\aventail_0.pbk" echo %line%
)
goto :eof
[Edit3]Ist immer noch alles Unsinn - eine Lösung steht in diesem mrt181-Beitrag[/Edit3]