Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Bestimmten Textblock in wini.ini anhand von Textdatei finden und löschen

Frage Entwicklung Batch & Shell

Mitglied: cbli

cbli (Level 1) - Jetzt verbinden

06.12.2006, aktualisiert 07.12.2006, 6098 Aufrufe, 7 Kommentare

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
Mitglied: bastla
06.12.2006 um 17:14 Uhr
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
Bitte warten ..
Mitglied: cbli
06.12.2006 um 17:30 Uhr
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



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
Bitte warten ..
Mitglied: maneich
06.12.2006 um 18:22 Uhr
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.

Mit freundlichen Grüßen maneich
Bitte warten ..
Mitglied: bastla
06.12.2006 um 20:19 Uhr
Hallo Claus!

Als VBScript:
01.
'CleanIni.vbs 
02.
 
03.
Const sIniFile = "C:\Windows\win.ini" 
04.
Const sDelFile = "D:\löschen.txt" 
05.
 
06.
Set fso = WScript.CreateObject("Scripting.FileSystemObject") 
07.
 
08.
Set oIniFile = fso.OpenTextFile(sIniFile, 1) 
09.
sIniData = oIniFile.Read(fso.GetFile(sIniFile).Size) 
10.
oIniFile.Close 
11.
 
12.
Set oDelFile = fso.OpenTextFile(sDelFile, 1) 
13.
sDelData = oDelFile.Read(fso.GetFile(sDelFile).Size) 
14.
oDelFile.Close 
15.
 
16.
iRemoved = 0 
17.
iPos = Instr(sIniData, sDelData) 
18.
If iPos Then 
19.
	Set oIniFile = fso.OpenTextFile(sIniFile, 2, True) 
20.
	oIniFile.Write Left(sIniData, iPos - 1) & Mid(sIniData, iPos + Len(sDelData) + 2) 
21.
	oIniFile.Close 
22.
	iRemoved = 1 
23.
End If 
24.
sMsg = "Fertig." 
25.
If iRemoved = 1 Then sMsg = sMsg & vbCrLF & vbCrLF & "Block wurde entfernt." 
26.
WScript.Echo sMsg 
27.
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:
01.
cscript //nologo CleanIni.vbs > nul || echo Block entfernt.
Grüße
bastla
Bitte warten ..
Mitglied: Biber
06.12.2006 um 21:43 Uhr
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
Bitte warten ..
Mitglied: bastla
07.12.2006 um 09:56 Uhr
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:
01.
'ReplaceSection.vbs 
02.
 
03.
Const sIniFile = "C:\Windows\win.ini" 
04.
Const sRepFile = "D:\Ersetzen.txt" 
05.
 
06.
Set fso = WScript.CreateObject("Scripting.FileSystemObject") 
07.
 
08.
Set oIniFile = fso.OpenTextFile(sIniFile, 1) 
09.
sIniData = oIniFile.Read(fso.GetFile(sIniFile).Size) 
10.
oIniFile.Close 
11.
 
12.
Set oRepFile = fso.OpenTextFile(sRepFile, 1) 
13.
sRepData = oRepFile.Read(fso.GetFile(sRepFile).Size) 
14.
oRepFile.Close 
15.
 
16.
iReplaced = 0 
17.
sSection = Trim(Left(sRepData, Instr(sRepData, "]"))) 
18.
If sSection <> "" Then 
19.
	iPos1 = Instr(sIniData, sSection) 
20.
	If iPos1 Then 
21.
		sIniDataNew = Left(sIniData, iPos1 - 1) 
22.
		iPos2 = Instr(iPos1 + 1, sIniData, "[") 
23.
		If iPos2 Then sIniDataNew = sIniDataNew & Mid(sIniData, iPos2) 
24.
		If Right(sIniDataNew, 2) = vbCrLF Then 
25.
			sIniDataNew = sIniDataNew & sRepData 
26.
		Else 
27.
			sIniDataNew = sIniDataNew & vbCrLF & sRepData 
28.
		End If 
29.
 
30.
		Set oIniFile = fso.OpenTextFile(sIniFile, 2, True) 
31.
		oIniFile.Write sIniDataNew 
32.
		oIniFile.Close 
33.
		iReplaced = 1 
34.
	End If 
35.
End If 
36.
sMsg = "Fertig." 
37.
If iReplaced = 1 Then sMsg = sMsg & vbCrLF & vbCrLF & "Section wurde ersetzt." 
38.
WScript.Echo sMsg 
39.
WScript.Quit(iReplaced)
Grüße
bastla
Bitte warten ..
Mitglied: cbli
07.12.2006 um 10:58 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...