cbli
Goto Top

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

Content-Key: 46169

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

Ausgedruckt am: 29.03.2024 um 01:03 Uhr

Mitglied: bastla
bastla 06.12.2006 um 17:14:17 Uhr
Goto Top
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
Mitglied: cbli
cbli 06.12.2006 um 17:30:57 Uhr
Goto Top
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?


ganz genau, der Inhalt von löschen.txt entspricht zeichengetreu dem aktuellen Abschnitt in der win.ini
Diese wird in der Regel nicht geändert und wenn dann nur von mir face-smile



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

"[WinPC]" entspricht immer der ersten Zeile in der Datei löschen.txt
Danach folgen entsprechende Einstellungen mit denen das Programm arbeitet.
Diese sind auf allen Clients gleich oder werden von mir noch angeglichen (moment da könnte man doch eine Batch....ne ne mach ich von Hand)


Danke für deine Eselsgeduld mit mir

Gruß
Claus
Mitglied: maneich
maneich 06.12.2006 um 18:22:07 Uhr
Goto Top
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
Mitglied: bastla
bastla 06.12.2006 um 20:19:53 Uhr
Goto Top
Hallo Claus!

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)
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:
cscript //nologo CleanIni.vbs > nul || echo Block entfernt.

Grüße
bastla
Mitglied: Biber
Biber 06.12.2006 um 21:43:43 Uhr
Goto Top
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
Mitglied: bastla
bastla 07.12.2006 um 09:56:15 Uhr
Goto Top
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).

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)
Grüße
bastla
Mitglied: cbli
cbli 07.12.2006 um 10:58:05 Uhr
Goto Top
Danke dir Bastla !
Hat genauso funktioniert wie ich es wollte. Perfekt !
Nochmal zu den näheren Umständen:

Hintergrund ist einfach der,daß wir hier im Betrieb gerade unsere Branchenlösung Software gewechselt haben,aber die alte Software zusätzlich noch ein Weilchen laufen muss bis die Übernahme komplett ist.
Die alte Software läuft nur unter einer Terminalemulation. Leider sind die Originaldisketten einem Unfall zum Opfer gefallen und da wir das Programm irgendwann gar nicht mehr brauchen ,war ein Neukauf wirtschaftlich nicht sinnvoll.
Deshalb musste ich eben eine installierte Version so bearbeiten,daß ich sie bei einem neuen User oder Neu Setup eines PC´s einfach kopieren konnte.
Dazu war dann eben die Bearbeitung der win.ini nötig.
Wie schon geschrieben hat jeder User die gleichen Einträge und deshalb reicht es mir nur zu checken ob eventuell die Einträge schon vorhanden sind,damit sie nicht doppelt eingetragen werden. Das Löschen der ganzen Sektion ist auf jeden Fall die beste Lösung.
Sollte sich doch mal noch was ändern ,muss ich eben nur den ersetzen.txt anpassen.


Thread kann also geschlossen werden.
Nochmals Dank

Gruß
Claus