Bestimmten Textblock in wini.ini anhand von Textdatei finden und löschen
Problem
Ich möchte die Datei win.ini auf einen bestimmten Eintrag prüfen und bei vorhandsein den gesamten vorhandenen Abschnitt aus einer bestehenden Textdatei auslesen und diesen dann aus der win.ini löschen lassen.
Danach wird ein neuer Abschnitt in die win.ini eingefügt (Diese batch funktioniert bereits).
Es sollen dabei auch keine Leerzeilen oder ähnliches durch das löschen und einfügen entstehen.
Beispiel:
win.ini prüfen -> enthält zeichenfolge "[WinPC]" nicht = normale verarbeitung
win.ini prüfen -> enthält zeichenfolge "[WinPC]" =
dann soll ein bestimmter Abschnitt aus der win.ini gelöscht werden.
z.B
[WinPC]
PATH=C:\WINPC
US1=428DAFC5C61D
US2=428DAFC5C61D
KEYBOARD=GE102AT.CLV
FONT=WINPCF.FON
DEVICE=Generic / Text Only,EPSON24,LPT1:
TOPS=150
BLINK=01
USE1A=0
USE0C=0
USE0A=0
USETIMER=0
Dieser Abschnitt ist als Textdatei vorhanden,z.b mit dem Namen löschen.txt.
Es soll also dann die löscht.txt benutzt werden um diesen Abschnitt aus der win.ini zu entfernen.
Danach soll mit der normalen Verarbeitung weitergemacht werden wo wieder etwas der wini.ini hinzugefügt wird.
Leerzeilen und diese Zeichen -> " "
sollen durch das einfügen und löschen nicht erzeugt werden
Danke nochmals für die Hilfe
Gruß
Claus
Ich möchte die Datei win.ini auf einen bestimmten Eintrag prüfen und bei vorhandsein den gesamten vorhandenen Abschnitt aus einer bestehenden Textdatei auslesen und diesen dann aus der win.ini löschen lassen.
Danach wird ein neuer Abschnitt in die win.ini eingefügt (Diese batch funktioniert bereits).
Es sollen dabei auch keine Leerzeilen oder ähnliches durch das löschen und einfügen entstehen.
Beispiel:
win.ini prüfen -> enthält zeichenfolge "[WinPC]" nicht = normale verarbeitung
win.ini prüfen -> enthält zeichenfolge "[WinPC]" =
dann soll ein bestimmter Abschnitt aus der win.ini gelöscht werden.
z.B
[WinPC]
PATH=C:\WINPC
US1=428DAFC5C61D
US2=428DAFC5C61D
KEYBOARD=GE102AT.CLV
FONT=WINPCF.FON
DEVICE=Generic / Text Only,EPSON24,LPT1:
TOPS=150
BLINK=01
USE1A=0
USE0C=0
USE0A=0
USETIMER=0
Dieser Abschnitt ist als Textdatei vorhanden,z.b mit dem Namen löschen.txt.
Es soll also dann die löscht.txt benutzt werden um diesen Abschnitt aus der win.ini zu entfernen.
Danach soll mit der normalen Verarbeitung weitergemacht werden wo wieder etwas der wini.ini hinzugefügt wird.
Leerzeilen und diese Zeichen -> " "
sollen durch das einfügen und löschen nicht erzeugt werden
Danke nochmals für die Hilfe
Gruß
Claus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 46169
Url: https://administrator.de/forum/bestimmten-textblock-in-wini-ini-anhand-von-textdatei-finden-und-loeschen-46169.html
Ausgedruckt am: 04.01.2025 um 23:01 Uhr
7 Kommentare
Neuester Kommentar
Hallo Claus!
Verstehe ich das so richtig:
Der Inhalt der "löschen.txt" muss als Block mit genau gleicher Schreibweise in der "win.ini" stehen und soll dann daraus entfernt werden?
Woher stammt das Kennzeichen für eine Verarbeitung (zB "[WinPC]")? Ist dies immer die erste Zeile des entsprechenden Abschnittes (und damit der "löschen.txt")?
Grüße
bastla
Verstehe ich das so richtig:
Der Inhalt der "löschen.txt" muss als Block mit genau gleicher Schreibweise in der "win.ini" stehen und soll dann daraus entfernt werden?
Woher stammt das Kennzeichen für eine Verarbeitung (zB "[WinPC]")? Ist dies immer die erste Zeile des entsprechenden Abschnittes (und damit der "löschen.txt")?
Grüße
bastla
Hallo,
jeder Abschnit der Win.ini beginnt ja mit der Überschrift in eckigen Klammern . Die einzelnen Abschnitte sind aber durch eine Leerzeile getrennt.
Um etwas aus einer Datei zu löschen mußt Du den Inhalt der Datei Zeile für Zeile überprüfen.
In Deinem Beispiel fragst Du 1. nach [WinPC], wenn nicht vorhanden in eine temporäre Datei schreiben, wenn vorhanden die weiteren Zeilen nach 2. der folgenden [*] abfragen und erst ab dieser Zeile wieder in temp. Datei weiterschreiben; danach die temp.Datei in die Win.ini zurück überschreiben.
Da du Dein System nicht genannt hast nur soviel:
bei Win9X-Systemen geht das nicht mit einer Batch sondern z.B. mit VBS
bei Systemen W2000 oder höher kann das mit einer Batch gemacht werden.
MfG maneich
jeder Abschnit der Win.ini beginnt ja mit der Überschrift in eckigen Klammern . Die einzelnen Abschnitte sind aber durch eine Leerzeile getrennt.
Um etwas aus einer Datei zu löschen mußt Du den Inhalt der Datei Zeile für Zeile überprüfen.
In Deinem Beispiel fragst Du 1. nach [WinPC], wenn nicht vorhanden in eine temporäre Datei schreiben, wenn vorhanden die weiteren Zeilen nach 2. der folgenden [*] abfragen und erst ab dieser Zeile wieder in temp. Datei weiterschreiben; danach die temp.Datei in die Win.ini zurück überschreiben.
Da du Dein System nicht genannt hast nur soviel:
bei Win9X-Systemen geht das nicht mit einer Batch sondern z.B. mit VBS
bei Systemen W2000 oder höher kann das mit einer Batch gemacht werden.
MfG maneich
Hallo Claus!
Als VBScript:
Für Verwendung im Batch kannst Du alle Zeilen mit "sMsg" entfernen (oder die Ausgabe nach "nul" umleiten) und den Errorlevel abfragen (1 bedeutet "Block entfernt", 0 eben nicht). Beispiel:
Grüße
bastla
Als VBScript:
'CleanIni.vbs
Const sIniFile = "C:\Windows\win.ini"
Const sDelFile = "D:\löschen.txt"
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set oIniFile = fso.OpenTextFile(sIniFile, 1)
sIniData = oIniFile.Read(fso.GetFile(sIniFile).Size)
oIniFile.Close
Set oDelFile = fso.OpenTextFile(sDelFile, 1)
sDelData = oDelFile.Read(fso.GetFile(sDelFile).Size)
oDelFile.Close
iRemoved = 0
iPos = Instr(sIniData, sDelData)
If iPos Then
Set oIniFile = fso.OpenTextFile(sIniFile, 2, True)
oIniFile.Write Left(sIniData, iPos - 1) & Mid(sIniData, iPos + Len(sDelData) + 2)
oIniFile.Close
iRemoved = 1
End If
sMsg = "Fertig."
If iRemoved = 1 Then sMsg = sMsg & vbCrLF & vbCrLF & "Block wurde entfernt."
WScript.Echo sMsg
WScript.Quit(iRemoved)
cscript //nologo CleanIni.vbs > nul || echo Block entfernt.
Grüße
bastla
Also, ich weiss ja nicht...
Bei allem Respekt vor bastla's handwerklich sauberer Lösung:
Für derartige Strategien hätte M$ keine Ini-Dateien erfinden müssen.
Das (relativ) schöne an INI-Dateien ist doch, dass
- eine [SectionXY] irgendwo in der .INI-Datei stehen kann - egal ob vor oder nach einer [SectionABC]
- ein "Key = Value"-Eintrag innerhalb einer Section beliebig vor oder nach einem anderen Eintrag stehen kann.Nix mit alphabetisch oder chronologisch.
- Sich niemand mit der Uhrmacherlupe drüberbeugen muss, um Klein- und Grossschreibung bei "Keys" oder Leerzeichen vor/nach dem Gleichheitszeichen oder trailing blanks zu beachten.
- und erst recht Leerzeilen innerhalb einer oder zwischen [Sections] vollkommen belanglos sind.
Somit sind doch auch bei allen INI-File-Bearbeitungstools (die ich gesehen habe) die Features
- Check einen [Section]-Eintrag auf Existenz und Create einen [Section]-Eintrag
- Delete eine [Section] mit allen Einträgen
sowie
- Check, Create, Alter und Delete gezielt einen Eintrag in einer bestimmten Section.
Die oben umgesetzte Strategie stösst doch schon bei 2 inhaltlich identischen Sections [WinPC] an ihre Grenzen, wenn
- aus Versehen mal ein Leerzeichen am Ende einer Zeile ist
- zwei Einträge in "vertauschter" Reihenfolge kommen
- der FONT mal "WINPCF.FON" und mal "WinPCF.fon" geschrieben wird...
---> Ich würde diese Mimik überdenken.
Da passt es sogar besser, die komplette Section [Win-PC] zu löschen, wenn denn eine gefunden wird und in jedem Fall neu anzulegen.
Aber dann wiederum braucht auch nicht jeder User eigene Einträge in der Win.ini - dann sollte in der Win.ini bestenfalls ein Verweis auf eine WinPC.ini auf einem Server oder im Applikationsverzeichnis stehen.
Gruß
Biber
Bei allem Respekt vor bastla's handwerklich sauberer Lösung:
Für derartige Strategien hätte M$ keine Ini-Dateien erfinden müssen.
Das (relativ) schöne an INI-Dateien ist doch, dass
- eine [SectionXY] irgendwo in der .INI-Datei stehen kann - egal ob vor oder nach einer [SectionABC]
- ein "Key = Value"-Eintrag innerhalb einer Section beliebig vor oder nach einem anderen Eintrag stehen kann.Nix mit alphabetisch oder chronologisch.
- Sich niemand mit der Uhrmacherlupe drüberbeugen muss, um Klein- und Grossschreibung bei "Keys" oder Leerzeichen vor/nach dem Gleichheitszeichen oder trailing blanks zu beachten.
- und erst recht Leerzeilen innerhalb einer oder zwischen [Sections] vollkommen belanglos sind.
Somit sind doch auch bei allen INI-File-Bearbeitungstools (die ich gesehen habe) die Features
- Check einen [Section]-Eintrag auf Existenz und Create einen [Section]-Eintrag
- Delete eine [Section] mit allen Einträgen
sowie
- Check, Create, Alter und Delete gezielt einen Eintrag in einer bestimmten Section.
Die oben umgesetzte Strategie stösst doch schon bei 2 inhaltlich identischen Sections [WinPC] an ihre Grenzen, wenn
- aus Versehen mal ein Leerzeichen am Ende einer Zeile ist
- zwei Einträge in "vertauschter" Reihenfolge kommen
- der FONT mal "WINPCF.FON" und mal "WinPCF.fon" geschrieben wird...
---> Ich würde diese Mimik überdenken.
Da passt es sogar besser, die komplette Section [Win-PC] zu löschen, wenn denn eine gefunden wird und in jedem Fall neu anzulegen.
Aber dann wiederum braucht auch nicht jeder User eigene Einträge in der Win.ini - dann sollte in der Win.ini bestenfalls ein Verweis auf eine WinPC.ini auf einem Server oder im Applikationsverzeichnis stehen.
Gruß
Biber
Hallo Claus!
Du hast zwar die näheren Umstände Deiner "Ini-Verwandlungs-Aktion" nicht beschrieben, aber für den "Normalfall" hat Biber ganz sicher recht (auch hinsichtlich der Leerstellen/-zeilen).
Grüße
bastla
Du hast zwar die näheren Umstände Deiner "Ini-Verwandlungs-Aktion" nicht beschrieben, aber für den "Normalfall" hat Biber ganz sicher recht (auch hinsichtlich der Leerstellen/-zeilen).
Da passt es sogar besser, die komplette Section [Win-PC] zu löschen, wenn denn eine gefunden wird und in jedem Fall neu anzulegen.
Auch dieser Vorgangsweise kann ich nur zustimmen und hätte daher folgende Variante anzubieten: Erstelle eine Datei "Ersetzen.txt" mit dem gewünschten neuen Abschnitt (der Name "[Win-PC]" muss am Anfang der "Ersetzen.txt" stehen) und verwende das folgende Script, um die alte Section zu löschen und die neue Section an das Ende der "win.ini" zu schreiben:'ReplaceSection.vbs
Const sIniFile = "C:\Windows\win.ini"
Const sRepFile = "D:\Ersetzen.txt"
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set oIniFile = fso.OpenTextFile(sIniFile, 1)
sIniData = oIniFile.Read(fso.GetFile(sIniFile).Size)
oIniFile.Close
Set oRepFile = fso.OpenTextFile(sRepFile, 1)
sRepData = oRepFile.Read(fso.GetFile(sRepFile).Size)
oRepFile.Close
iReplaced = 0
sSection = Trim(Left(sRepData, Instr(sRepData, "]")))
If sSection <> "" Then
iPos1 = Instr(sIniData, sSection)
If iPos1 Then
sIniDataNew = Left(sIniData, iPos1 - 1)
iPos2 = Instr(iPos1 + 1, sIniData, "[")
If iPos2 Then sIniDataNew = sIniDataNew & Mid(sIniData, iPos2)
If Right(sIniDataNew, 2) = vbCrLF Then
sIniDataNew = sIniDataNew & sRepData
Else
sIniDataNew = sIniDataNew & vbCrLF & sRepData
End If
Set oIniFile = fso.OpenTextFile(sIniFile, 2, True)
oIniFile.Write sIniDataNew
oIniFile.Close
iReplaced = 1
End If
End If
sMsg = "Fertig."
If iReplaced = 1 Then sMsg = sMsg & vbCrLF & vbCrLF & "Section wurde ersetzt."
WScript.Echo sMsg
WScript.Quit(iReplaced)
bastla