mrt181
Goto Top

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):

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"  
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?

Content-ID: 73567

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

miniversum
miniversum 14.11.2007 um 18:00:06 Uhr
Goto Top
'Wenn Du die Zeile
echo %line% >>"%source%\aventail_0.pbk"
Durch diese ersetzt:
(echo %line%)1>>"%source%\aventail_0.pbk"
sollte es bei jedem Eintrag gehen.

miniversum
mrt181
mrt181 14.11.2007 um 18:08:48 Uhr
Goto Top
Vielen Dank, so funktioniert es.

Warum funktioniert es so? Was bedeutet die 1 hinter der Klammer?

bye martin
miniversum
miniversum 14.11.2007 um 18:25:49 Uhr
Goto Top
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.
echo bla 1>Datei.txt
und die Ausgabe bei einem Fehler
echo 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
mrt181
mrt181 14.11.2007 um 18:44:02 Uhr
Goto Top
jetzt habe ich es verstanden, mit der zahl hinter der klammer sage ich dem echo an welches gerät (std*) der befehl gesendet werden soll, vielen dank für die info.
Biber
Biber 14.11.2007 um 19:15:33 Uhr
Goto Top
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:
@echo test mehrtest 1
test mehrtest 1
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):
@echo test mehrtest 1>con
test mehrtest
@echo test mehrtest 1>test.txt
type test.txt
test mehrtest
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:
>>"%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")  
NEU:
for /F "delims=: tokens=1,2*" %%a in ('findstr /n . "%source%\aventail.pbk"') do call :replace "%%b"  
[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:
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
[/Edit2]
[Edit3]Ist immer noch alles Unsinn - eine Lösung steht in diesem mrt181-Beitrag[/Edit3]