Hallo,
ich habe da ein kleines Problem. Ich muss eine Zeile in die Datei @SystemDir & "\drivers\etc\services" schreiben.
Der Aufbau der Datei "services" ist: <service name> <port number>/<protocol> [aliases...] [#<comment>]
Anhand des <service name> durchsuche ich die Datei und ersetze ggfs. einen vorhandenen Eintrag. Leider kann es vorkommen, dass der <service name> mehrfach eingetragen ist. Dies sollte zwar nicht sein, aber passiert, wenn man eine Software mehrfach installiert... Manchmal kommt es sogar vor, dass die Einträge der <port numbers/protocol> unterschiedlich sind, ein Kommentar vorhanden ist oder nicht...
Derzeit kann ich zwar alle vorhandenen Einträge (basierend auf dem <service name>) finden und ersetzen, aber irgendwie funktioniert das Löschen der doppelten Einträge nicht.
Im angehängten Skript habe ich die Lösch-Zeilen 'mal mit ";~" auskommentiert, vielleicht habt Ihr ja eine Idee dazu...
(Der Einfachheit halber habe ich mir die services Datei ins Skriptverzeichnis kopiert, dann testet es sich besser... s. Skript)
;*******************************************************************************************************************************
#include <File.au3>
$srcfile=@ScriptDir & "\services"
$replaceString="sapmsFC1"&@TAB&"3680/tcp"&@TAB&"# SAP System Messaging Service Port"
$searchString="sapmsFC1"
Search_And_Replace ($srcfile, $searchString, $replaceString, 1)
[/autoit][autoit][/autoit][autoit]func Search_And_Replace ($s_file, $s_searchString, $s_replaceString, $b_DeleteDuplicates)
; $s_file = filename
; $s_searchString = string to search in file
; $s_replaceString = string to replace the searched string in file
; $b_DeleteDuplicates = flag, value 0=no or 1=yes, to deletes all duplicate lines of the search string or not,
Dim $aLines [1000]
Dim $stringCount
$sfile=FileOpen($s_file, 0)
for $i = 1 to _FileCountLines($s_file)
$readline = FileReadLine($sfile, $i)
if StringInStr($readline, $s_searchString, 2) Then
$stringCount += 1
$aLines [$stringCount] = $i
;MsgBox(0, "String found!", "The String " & $s_searchString & " is found in line: " & $i)
_FileWriteToLine($s_file, $i, $s_replaceString, 1)
EndIf
Next
;~ Does not work, deletes only one of the wihshed lines and some other :-(...
;~
;~ if $b_DeleteDuplicates = 1 Then
;~ for $j=1 To $stringCount + 1
;~ MsgBox(0, "number", $stringCount)
;~ _FileWriteToLine($s_file, $aLines[$j], "", 1)
;~ Next
;~ EndIf
;MsgBox(0,"", $s_searchString & " entry does not exist!")
FileClose($sfile)
EndFunc
;*******************************************************************************************************************************
Hier Suchen und Ersetzten habe ich zwar eine Suchen&Ersetzen gefunden, allerdings muss dafür dann die ganze Zeile identisch sein... Vielleicht ist es auch tatsächlich besser eine Tmp-Datei zu nutzen... ich bin für jeden Vorschlag offen...
Beispiel-Auszug aus services Datei:
sapgw92 3392/tcp
sapmsFC1 3123/tcp # SAP System Messaging Service Port
sapgw93 3393/tcp
sapgw94 3394/tcp
sapgw95 3395/tcp
sapmsFC1 3680/tcp # SAP System Messaging Service Port
sapgw96 3396/tcp
sapgw97 3397/tcp
sapgw98 3398/tcp
sapgw99 3399/tcp
sapmsP48 3600/tcp
sapmsFC1 3345/udp # SAP System Messaging Service Port
Alles anzeigen
mfg
Axel