77575
Goto Top

Ini Datei Blöcke löschen

Hallo,

ich möchte aus einer ini Datei den Inhalt von Blöcken löschen. Habe eine ähnliche Frage hier im Forum gefunden, jedoch ging es da um vbs. meine Lösung kann nicht mit vbs reallisiert werden. Ich muss dies in ein bestehendes cmd Skript einarbeiten.

Ein kleines Bsp.
[function1]
param0=2435
param1=xyz
param2=ddddd

[color]
colorbackground=black
colorforground=white

...usw.

Ich möchte jetzt das alle Einträge von [function1] gelöscht werden, nicht der Eintrag [function1] selbst, bis zum nächsten Block.

Einzelne Zeilen kann ich löschen dafpr hab ich schon cmd code gefunden nur ändern sie die Anzahl der Parameter immer, also kann ich auch nicht einfach sagen die nächsten 5 zeilen ab [function1] sollen gelöscht werden, es können auch 250 oder mehr sein.

Danke schonmal für die Hilfe und eure Anregungen.

gruss 01

Content-Key: 191565

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

Printed on: April 25, 2024 at 00:04 o'clock

Member: bastla
bastla Sep 20, 2012 at 21:32:06 (UTC)
Goto Top
Hallo 01-01-01!

Das könnte so gehen:
@echo off & setlocal
set "Ein=D:\Die alte.ini"  
set "Aus=D:\Die neue.ini"  
set "Ab=[function1]"  
set "Schreiben=true"  

del "%Aus%" 2>nul  
for /f "delims=" %%i in ('findstr /n "^" "%Ein%"') do set "Zeile=%%i" & call :ProcessLine  
goto :eof

:ProcessLine
echo "%Zeile%"|findstr "[">nul && set "Schreiben=true"  
if /i "%Zeile:*:=%"=="%Ab%" (  
    set "Schreiben="  
) else (
    setlocal enabledelayedexpansion
    if defined Schreiben >>"%Aus%" echo(!Zeile:*:=!  
    endlocal
)
goto :eof
Es werden so alle Zeilen nach dem in Zeile 4 festgelegten Section-Header bis zur nächsten Zeile, die "[" enthält, gelöscht ...

Grüße
bastla
Member: 0x32f1
0x32f1 Sep 21, 2012 at 06:50:11 (UTC)
Goto Top
Vor Jahren hatte mir EditINI von kostis.net geholfen:

Programm:
http://www.kostis.net/freeware/editini.zip

HTML-Doku:
http://www.kostis.net/freeware/editini.htm
Mitglied: 77575
77575 Sep 21, 2012 at 08:20:23 (UTC)
Goto Top
Hi Bastla,

danke erstmal für die schnelle Antwort und deine Mühen.

Funktioniert noch nicht ganz.
Das Skript löscht zwar etwas raus aber nicht das was es soll.

Es werden 4 Blöcke am Anfang der Datei stehen gelassen, dann fängt das Skript an alles andere zu löschen.

Hier meine Variablen:

set "Ein=D:\tmp\Settings.ini"
set "Aus=D:\tmp\Settings_neu.ini"
set "Ab=[Recent File List]"
set "Schreiben=true"

Die ini Datei:
[Recent File List]
File1=C:\Users\blah\Documents\irgendwas.txt
File10=D:\tmp\sddsdso.doc
File2=C:\Users\blah\Documents\test.txt
File3=\\server1\freigabe1\test.doc
File4=E:\Dateien\hallo.cmd

[IRGENDWAS]
1=sddasdd
2=asdfsdff

Leider werde ich aus der Syntax nicht schlau, vielleicht weißt du ja warum das so ist.

Gruss 01
Member: bastla
bastla Sep 21, 2012 at 08:36:06 (UTC)
Goto Top
Hallo 01-01-01!

Sorry - kann ich nicht nachvollziehen; beim Test mit Deiner dargestellten (BTW: sollte besser, wie auch Batch-Zeilen, als "Code" formatiert sein) ini-Datei und meinem geposteten Batch erhalte ich als Ergebnis
[IRGENDWAS]
1=sddasdd
2=asdfsdff
Grüße
bastla
Mitglied: 77575
77575 Sep 21, 2012 at 09:57:12 (UTC)
Goto Top
Ich hab das jetzt mehrfach getestet und in den ersten 3 Blöcken auch mal Wert mit # oder _ weggelöscht, weil ich gedacht habe es liegt vielleicht an einem Sonderzeichen.
Aber es löscht immer ab der ersten Zeile des Blocks [Replace History]. Auch wenn ich zum testen den Block in [ReplaceHistory] ändere oder den Wert 0="shsfghsg" in etwas anderes ändere.

Ich kann auch einen oder alle Blöcke am Anfang löschen, so das [Replace History] in der ersten zeile steht. Dann löscht es trotzdem alles nach 0="shsfghsg"

[TBCFG-Advanced-Bar3]
Bar#0=0
Bar#1=34771
Bar#2=0
BarID=59420
Bars=3

[Language 3 Colors]
Colors=0,8421376,842ertwer768,4210816,16711680,16711680,16711680,
Colors Auto Back=1,1,1,1,1,1,1,1,1,1,1,1,1,
Colors Back=16777215,16777215,16777wtert15,16777215,16777215,16777215,16777215,16777215,16777215,16777215,16777215,16777215,
Font Style=0,0,0,0,0,0,0,0,0,0,0,0,0,
Bar1=3

[ToolBarState1-v140-Bar3]
Bar0=0
Bar1=3
Bar1=3
Bar1=3

[Replace History]
0="shsfghsg"  


gruss 01
Mitglied: 77575
77575 Sep 21, 2012 at 10:04:06 (UTC)
Goto Top
Hi, ich nochmal.

Wenn du es mit dieser ini Datei versuchst, was kommt dann bei dir raus?

[TBCFG-Advanced-Bar3]
Bar#0=0
Bar#1=34771
Bar#2=0
BarID=59420
Bars=3

[Language 3 Colors]
Colors=0,8421376,8421gasdfgsdfgdg
Colors Auto Back=1,1,6546356,1,
Colors Back=16777215,16777466dggsgf,
Font Style=0,0,0,0,0,0,0,0,0,0,0,0,0,

[Recent File List]
File1=testtest
File10=testtest
File2=testtest
File3=testtest
File4=testtest
File5=testtest
File6=testtest
File7=testtest
File8=testtest
File9=testtest

[ToolBarState1-v140-Bar3]
Bar#0=0
Bar#1=34771
Bar#2=0
BarID=59420
Bars=3

[Replace History]
0="HKEY_LOCAL_MACHINE\_D\"  
1="wwwww"  
2="wwweer"  
3="www"  
4="adadad"  

[BookMark]
sizeFloatCX=220
sizeFloatCY=220
sizeHorzCX=220
sizeHorzCY=190
sizeVertCX=190
sizeVertCY=342
Member: bastla
bastla Sep 21, 2012 updated at 10:15:16 (UTC)
Goto Top
Hallo 01-01-01!

Das sähe dann bei mir so aus (Ablauf in der CMD-Shell):
D:\>type EntferneBlock.cmd
@echo off & setlocal
set "Ein=D:\tmp\Settings.ini"  
set "Aus=D:\tmp\Settings_neu.ini"  
set "Ab=[Recent File List]"  
set "Schreiben=true"  

del "%Aus%" 2>nul  
for /f "delims=" %%i in ('findstr /n "^" "%Ein%"') do set "Zeile=%%i" & call :Pr  
ocessLine
goto :eof

:ProcessLine
echo "%Zeile%"|findstr "[">nul && set "Schreiben=true"  
if /i "%Zeile:*:=%"=="%Ab%" (  
    set "Schreiben="  
) else (
    setlocal enabledelayedexpansion
    if defined Schreiben >>"%Aus%" echo(!Zeile:*:=!  
    endlocal
)
goto :eof
D:\>type D:\tmp\Settings.ini
[TBCFG-Advanced-Bar3]
Bar#0=0
Bar#1=34771
Bar#2=0
BarID=59420
Bars=3

[Language 3 Colors]
Colors=0,8421376,8421gasdfgsdfgdg
Colors Auto Back=1,1,6546356,1,
Colors Back=16777215,16777466dggsgf,
Font Style=0,0,0,0,0,0,0,0,0,0,0,0,0,

[Recent File List]
File1=testtest
File10=testtest
File2=testtest
File3=testtest
File4=testtest
File5=testtest
File6=testtest
File7=testtest
File8=testtest
File9=testtest

[ToolBarState1-v140-Bar3]
Bar#0=0
Bar#1=34771
Bar#2=0
BarID=59420
Bars=3

[Replace History]
0="HKEY_LOCAL_MACHINE\_D\"  
1="wwwww"  
2="wwweer"  
3="www"  
4="adadad"  

[BookMark]
sizeFloatCX=220
sizeFloatCY=220
sizeHorzCX=220
sizeHorzCY=190
sizeVertCX=190
sizeVertCY=342

D:\>EntferneBlock.cmd

D:\>type D:\tmp\Settings_neu.ini
[TBCFG-Advanced-Bar3]
Bar#0=0
Bar#1=34771
Bar#2=0
BarID=59420
Bars=3

[Language 3 Colors]
Colors=0,8421376,8421gasdfgsdfgdg
Colors Auto Back=1,1,6546356,1,
Colors Back=16777215,16777466dggsgf,
Font Style=0,0,0,0,0,0,0,0,0,0,0,0,0,

[ToolBarState1-v140-Bar3]
Bar#0=0
Bar#1=34771
Bar#2=0
BarID=59420
Bars=3

[Replace History]
0="HKEY_LOCAL_MACHINE\_D\"  
1="wwwww"  
2="wwweer"  
3="www"  
4="adadad"  

[BookMark]
sizeFloatCX=220
sizeFloatCY=220
sizeHorzCX=220
sizeHorzCY=190
sizeVertCX=190
sizeVertCY=342

D:\>
Grüße
bastla
Mitglied: 77575
77575 Sep 21, 2012 at 11:18:00 (UTC)
Goto Top
Ja. es wird aber auch der Block "Titel" [Recent File List] mit gelöscht.
Aber das ist nicht schlimm. Das Programm legt es dann wieder an.

Ich denke das kann ich so bei mir einbauen.
Danke dir.

gruss 01
Mitglied: 77575
77575 Sep 21, 2012 at 11:47:10 (UTC)
Goto Top
Hallo, zu früh gefreut.

Wenn ich das jetzt mit der original ini Datei machen, löscht es wieder alles raus ab
[Replace History]
0="HKEY_LOCAL_MACHINE\_D\"  
Ich weiß jetzt aber auch warum


wenn diese Zeilen auftauchen, löscht es alles raus
1="width="130""  
2="width="125""  
3="width="120""  

Der komplette Block der das Problem macht sieht so aus:
[Replace History]
0="HKEY_LOCAL_MACHINE\_D\"  
1="width="130""  
2="width="125""  
3="width="120""  

alles ab 1="width="130"" wird gelöscht.

gruss 01
Member: pieh-ejdsch
pieh-ejdsch Sep 21, 2012, updated at Sep 24, 2012 at 10:03:29 (UTC)
Goto Top
moin 01,

bei Sonderzeichen nehme ich gerne auch den Vergleich in Delayedexpansion auf:
zB. so
IF !Line:*:^=! equ [XYZ] echo ja ...
aber das brauch mer hier ja gar net.
@echo off
setlocal
set "Ein=D:\Die alte.ini"  
set "Aus=D:\Die neue.ini"  
set "Ab=[function1]"  
set "Schreiben=true"  

3>"%Aus%" (  
  for /f "delims=" %%i in ('findstr /n "^" "%Ein%"') do (  
    for /f "tokens=2delims=" %%j in ("%%i") do if "[%%j]" neq "%AB%" (set "Schreiben=1") else set "Schreiben="  
    set "Line=%%i"  
    setlocal enabledelayedexpansion
    if defined Schreiben >&3 echo(!line:*:=!
    endlocal
) )

[Edit]Nummerierung entfernen eingefügt.[/Edit]
[edit2]Klammer zu gesponsort.[/edit2]

Gruß Phil
Member: bastla
bastla Sep 21, 2012 at 12:59:33 (UTC)
Goto Top
Hallo 01-01-01!

Sollte sich mit folgender Änderung machen lassen:
:ProcessLine
echo "%Zeile%"|findstr "[">nul && set "Schreiben=true"  
echo "%Zeile%"|findstr /i "%Ab%">nul && set "Schreiben="  
setlocal enabledelayedexpansion
if defined Schreiben >>"%Aus%" echo(!Zeile:*:=!  
endlocal
goto :eof
Grüße bastla

P.S.: Wenn Du gleich repräsentative Testdaten verwendet hättest ...
Mitglied: 77575
77575 Sep 24, 2012 at 08:39:12 (UTC)
Goto Top
Zitat von @bastla:

P.S.: Wenn Du gleich repräsentative Testdaten verwendet hättest ...

sorry, aber ich konnte ja nicht ahnen das das skript an der stelle probleme macht.
die ini datei hat über 1500 zeilen und da genau die repräsentativen Blöcke rauszufiltern ist nicht möglich.

Das skript läuft zwar und löscht den block raus den es soll, aber auch noch andere blöcke und zeilen.
ich denke da jetzt jede Zeile rauszufiltern macht keinen sinn.

Aber danke für eure mühen, das skript kann ich sicher auch mal woanders verwenden.

gruss 01
Member: pieh-ejdsch
pieh-ejdsch Sep 24, 2012 at 10:30:21 (UTC)
Goto Top
moin,

@bastla Dein findstr sucht aber auch nach einem Ausdruck und somit auch nach einer [Zeichenklasse]
besser wäre da eventuell find oder findstr /c:"bla" :
:ProcessLine
cmd /von /c "echo(!Zeile!"|find "[">nul && set "Schreiben=true"  
cmd /von /c "echo(!Zeile!"|find /i "%Ab%">nul && set "Schreiben="  
...
@77575
kann ich so nicht nachvollziehen, der Code funktioniert: hier

Gruß Phil
Member: bastla
bastla Sep 24, 2012 at 13:42:33 (UTC)
Goto Top
@ph
Yep - bzw zusätzlich
set "Ab=\[Recent File List\]"
Grüße
bastla