mrt181
Goto Top

Batch - Leerzeilen beim auslesen mit for Schleife mitnehmen?

hallo,

gibt es eine Möglichkeit beim auslesen einer Datei per:

for /F "tokens=*" %%a in ('type "%source%\aventail.pbk"') do (call :replace "%%a")  

die in der Datei vorhanden Leerzeilen in eine anschließend zu schreibende Datei mitzunehmen? Die Ausgangsdatei enthält keine Leerzeichen.

bye martin

Content-Key: 73577

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

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

Member: Biber
Biber Nov 14, 2007 at 18:48:24 (UTC)
Goto Top
Moin mrt181,

habe schon in Deinem Vorgänger-Beitrag geantwortet.

for /F "tokens=2,*" %%a in ('findstr /n . "%source%\aventail.pbk"') do (call :replace "%%a")  

...wobei es dann sein kann, dass Parameter1 der :replace-Subroutine so aussieht: ""

Du solltest also, wenn Du auch wieder eine Leerzeile AUSgeben willst, diesen Fall prüfen.

:replace
IF [%~1]== (
   echo.>>%whereever%
   goto :eof
)
>>%whatever% echo %~1
goto :eof

Grüße
Biber
Member: mrt181
mrt181 Nov 14, 2007 at 19:14:02 (UTC)
Goto Top
also mein skript editiert in seiner ganzheit:

set source=%allusersprofile%\Anwendungsdaten\Microsoft\Network\Connections\Pbk

for /F "delims=: tokens=2*" %%a in ('findstr /n . "%source%\aventail.pbk"') do call :replace1 "%%a"  
for /F "delims=: tokens=2*" %%a in ('findstr /n . "%source%\rasphone.pbk"') do call :replace2 "%%a"  
goto end

:replace1
If [%~1]== (
   echo.>>"%source%\aventail_0.pbk"  
 ) ELSE (
set line=%~2
set line=%line:url.de=199.199.199.199%
>>"%source%\aventail_0.pbk" echo %line%  
)
goto end2

:replace2
If [%~1]== (
   echo.>>"%source%\rasphone_0.pbk"  
 ) ELSE (
set line=%~2
set line=%line:url.de=199.199.199.199%
>>"%source%\rasphone_0.pbk" echo %line%  
)goto end2

:end
move /Y "%source%\aventail_0.pbk" "%source%\aventail.pbk"  
move /Y "%source%\aventail_0.pbk" "%source%\rasphone.pbk"  
exit

:end2

ich bekomme, wenn ich es aus dem Terminal starte, ein Fehlermeldung:

C:\>set source=C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Microsoft\Network\Connections\Pbk

C:\>for /F "delims=: tokens=2*" %a in ('findstr /n . "C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\Microsoft\Network\Connections\Pbk\aventail.pbk"') do call :replace1 "%a"  

C:\>call :replace1 "[Aventail VPN Connection]"  
"VPN" ist syntaktisch an dieser Stelle nicht verarbeitbar.  

C:\>If [[Aventail VPN Connection]]== (
Member: Biber
Biber Nov 14, 2007 at 19:36:16 (UTC)
Goto Top
Moin mrt,

dann bitte zwei kleine Änderungen:

:: Änderung 1:
If "%~1"=="" (  
  ....
) ELSE (
:: Änderung2:
set line=%~1
....
)

Grüße
Biber
Member: mrt181
mrt181 Nov 14, 2007 at 22:13:45 (UTC)
Goto Top
hi hilft auch nicht weiter.

der output in der datei hat nach wie vor keine leerzeilen.
Member: Biber
Biber Nov 14, 2007 at 23:00:44 (UTC)
Goto Top
hi hilft auch nicht weiter.

der output in der datei hat nach wie vor keine leerzeilen.

Bin ja auch blöd. Sorry.

STREICHE:
for /F "delims=: tokens=2*" %%a in ('findstr /n . "%source%\aventail.pbk"') do call :replace1 "%%a"  
for /F "delims=: tokens=2*" %%a in ('findstr /n . "%source%\rasphone.pbk"') do call :replace2 "%%a"  
SETZE:
for /F "delims=: tokens=1,2*" %%a in ('findstr /n . "%source%\aventail.pbk"') do call :replace1 "%%b"  
for /F "delims=: tokens=1,2*" %%a in ('findstr /n . "%source%\rasphone.pbk"') do call :replace2 "%%b"  

Und mach bitte BTW aus dem "goto :end2" jeweils ein "goto :eof".

Und erzähl nix von unserem Rumgeeiere hier weiter bitte...

Grüße
Biber
Member: miniversum
miniversum Nov 15, 2007 at 06:58:33 (UTC)
Goto Top
Und erzähl nix von unserem Rumgeeiere hier weiter bitte...

Zu spät schon gesehen.. grins..
Member: mrt181
mrt181 Nov 15, 2007 at 09:15:21 (UTC)
Goto Top
so hier das editierte skript, welches ich um Kommentare erweiter habe, in der Hoffnung das auch nachfolgende Generationen dies nachvollziehen können:

@echo off

set source=%allusersprofile%\Anwendungsdaten\Microsoft\Network\Connections\Pbk

:main
:: sucht jedes beliebige Zeichen und übergibt an replace den zweiten, durch colon getrennten, Token bis Zeilenende
for /F "delims=: tokens=1,2*" %%a in ('findstr /n . "%source%\aventail.pbk"') do call :sub_replace1 "%%b"  
for /F "delims=: tokens=1,2*" %%a in ('findstr /n . "%source%\rasphone.pbk"') do call :sub_replace2 "%%b"  

move /Y "%source%\aventail_0.pbk" "%source%\aventail.pbk"  
move /Y "%source%\rasphone_0.pbk" "%source%\rasphone.pbk"  
exit

:sub_replace1
If "%~1"=="" (  
   echo.>>"%source%\aventail_0.pbk"  
 ) ELSE (
:: setzt line Variable auf token aus der for Schleife
set line=%~1
:: sucht nach string (hier: url.de) und erstetzt diesen mit einem anderen (hier: 199.199.199.199)
set line=%line:url.de=199.199.199.199%
:: schreibt line in Datei (Reihenfolge wichtig: bei echo %line%>>"%source%\aventail_0.pbk"  werden 0 und 1 am Ende von %line% nicht gesichert)  
>>"%source%\aventail_0.pbk" echo %line%  
)
goto :eof

:sub_replace2
If "%~1"=="" (  
   echo.>>"%source%\rasphone_0.pbk"  
 ) ELSE (
set line=%~1
set line=%line:url.de=199.199.199.199%
>>"%source%\rasphone_0.pbk" echo %line%  
)
goto :eof

er schreibt in die aventail.pbk folgendes (die Punkte symbolisieren viele Zeilen mit dem selben Inhalt):

ECHO ist eingeschaltet (ON).
url.de=199.199.199.199
199.199.199.199=199.199.199.199
.
.
.
199.199.199.199=199.199.199.199

er schreibt in die rasphone.pbk folgendes (die Punkte symbolisieren viele Zeilen mit dem selben Inhalt):

199.199.199.199=199.199.199.199
.
.
.
199.199.199.199=199.199.199.199

Die Frage die sich mir stellt ist ob für eine Leerzeile überhaupt ein Token angelegt wird

[EDIT]
Kommentiere ich das IF, also die Prüfung auf "", aus, dann funktioniert es, übernimmt aber keine Leerzeilen.

Habe mal statt
do call :replace "%%b"  
do echo "%%b"  
versucht.

Die Ausgabe hat keine Leerzeilen. Es werden also für Leerzeilen gar keine Tokens angelegt. Gibt es ein Zeichen für Newline in batch?
Member: Biber
Biber Nov 15, 2007 at 13:21:15 (UTC)
Goto Top
Moin mrt181,

letzte Änderung:
Streiche: 'findstr /n . "%source%\aventail.pbk' ( und entsprechend in der Folgezeile)

SETZE: 'findstr /n $ "%source%\aventail.pbk'

und dann SETZE den Beitrag auf gelöst.

Grüße
Biber
Member: mrt181
mrt181 Nov 15, 2007 at 16:53:28 (UTC)
Goto Top
hi biber,

so weit so gut. wenn ich die letzte änderung durchführe, ändert sich am ouput (sieh oben) nichts. Änder ich die :sub_replace so:

:sub_replace1
set "line=%~1"  
if "%line%"=="" (  
    echo.>>"%source%\aventail_0.pbk"  
 ) else (
set line=%line:url.de=199.199.199.199%
>>"%source%\aventail_0.pbk" echo %line%  
)
goto :eof

dann werden auch die leerzeilen übernommen aber der string nicht getauscht.

P.S.: ich muss token=1,* setzen, da er bei token=1,2* nach einem zweiten doppelpunkt die Zeile abschneidet( bsp. 33:Path=C:\windows)
Member: Biber
Biber Nov 15, 2007 at 17:47:36 (UTC)
Goto Top
Moin mrt181,

das kann ich erklären und beseitigen.

Es sieht zwar mehrzeilig aus, aber für die CMD.exe ist das ganze "IF..(...) ELSE (....)" eine einzige Zeile.
In der dann auch die Variable %line% nur einen einzigen Wert hat.
Nämlich den, den zu Beginn dieser Zeile hatte.

Also bitte lass es uns auseinanderziehen.
...
:sub_replace1
set "line=%~1"  
if "%line%"=="" (  
    echo.>>"%source%\aventail_0.pbk"  
    goto :eof
) 
set line=%line:url.de=199.199.199.199%
>>"%source%\aventail_0.pbk" echo %line%  
goto :eof

Jetzt sind es auch für die CMD.exe mehrere Zeilen und somit kein Problem.
Und der String "url.de" sollte jetzt ersetzt werden.

Grüße
Biber
Member: mrt181
mrt181 Nov 15, 2007 at 18:30:10 (UTC)
Goto Top
super, vielen, vielen dank für die hilfe
Member: Biber
Biber Nov 16, 2007 at 19:20:34 (UTC)
Goto Top
Moin mrt181,

ich hab es Dir noch ein bisschen eingedampft.
Weil es ja so furchtbar lange gedauert hat...

::------snipp pbkCloner.bat
@echo off & setlocal
set "source=%allusersprofile%\Anwendungsdaten\Microsoft\Network\Connections\Pbk"  
For %%i in (rasphone aventail) do call :CloneMirDiePbk "%source%\%%i.pbk" "%source%\%%i_0.pbk"  
Goto :eof && REM oder "exit", wenn es sein muss  
~~~~~~~~~~
:CloneMirDiePbk
:: sucht jedes beliebige Zeichen und übergibt an replace den zweiten, durch colon getrennten, Token bis Zeilenende
for /F "delims=: tokens=1,2*" %%a in ('findstr /n $ %1') do call :sub_replace "%%b" %2  
move /Y %2 %1
goto :eof 
~~~~~~~~
:sub_replace
set "line=%~1"  
if "%line%"=="" (echo.>>%2) && goto :eof  
>>%2 echo %line:url.de=199.199.199.199%
goto :eof
::----------- snapp pbkCloner.bat

Schönes Wochenende
Biber