Text einfügen, löschen, ersetzten

  • Hallo Leute,

    ich habe ca. 300 Dateien bei den ich unten aufgeführte Aktionen durchführen möchte.

    [autoit]

    ;~ Pfad, wo die *.PCF-Dateien liegen
    $pfad = "c:\admin_V8\config\project_config"
    ;~ Nur für die Dateiendung:
    $ext = "*.pcf"

    [/autoit][autoit][/autoit][autoit]

    ;~ Textanfang (links) in der Datei suchen und dadrünter neuen Text einfügen
    $Text1_Search = "MS_DESIGNSEED ="
    $Text1_Paste = "%lock MS_DESIGNSEED"
    $Text2_Search = "MS_SEEDFILES ="
    $Text2_Paste = "# Verzeichnis der Seeddateien"
    ;~ usw.

    [/autoit][autoit][/autoit][autoit]

    ;~ Textanfang (links) in der Datei suchen und dann die ganze Zeile löschen
    $Text1_Delete = "MS_COMPRESS_OPTIONS"
    $Text2_Delete = "MS_LEVEL_EDIT_NESTED_ATTACHMENT_LEVELS"
    ;~ usw.

    [/autoit][autoit][/autoit][autoit]

    ;~ Textanfang (links) in der Datei suchen und dann mit neuem Text ersetzen
    $Text1_Find = "MS_OTWREG_NOCHECK = 1"
    $Text2_Replace = "MS_OTWREG_NOCHECK = 0"
    ;~ usw.

    [/autoit][autoit][/autoit][autoit]

    ;~ Text am Ende der Datei einfügen
    $Text1_New = "MS_OPENDESIGNFILEFILTER = *.dgn"
    $Text2_New = "MS_REF_DEFAULTSETTINGS = saveRelativePath=0,ignoreWhenNesting=0"
    ;~ usw.

    [/autoit]

    Wie mache ich das ?

    Besten Dank im Voraus !

    Viele Grüße,
    Dino

    Einmal editiert, zuletzt von Dino (4. Februar 2010 um 23:34)

  • Schau dir mal

    [autoit]

    FileRead
    FileWrite
    FileReadLine
    FileWriteLine
    _FileListToArray ;schaut, welche dateien im ordner sind, und dann mit for schleife alle ändern
    _FileReadToArray
    _FileWriteFromArray

    [/autoit]

    an

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Hallo
    das ist ein schönes Beispiel für die Anwendung der Datei-Funktionen. Du suchst mit den Befehlen FileFindFirstFile und FileFindNextFile die 300 Dateien und liest sie mit FileOpen und FileReadLine zeilenweise ein. Dann prüfst du die Zeilen mit den Stringfunktionen und änderst sie entsprechend. Die Ergebnisse gibst du in eine neue Datei in einem anderen Verzeichnis mit FileWriteLine aus.
    Macht ein wenig Arbeit, aber die Funktionen sind in der AutoIt-Hilfe recht gut beschrieben.

    Viele Grüsse
    Detlef

  • Probier mal dieses Script. Wenn es nicht klappt wär es nett wenn du mal eine Datei als Beispiel posten könntest.

    Spoiler anzeigen
    [autoit]

    ;~ Pfad, wo die *.PCF-Dateien liegen
    $sPfad = "c:\admin_V8\config\project_config"
    ;~ Nur für die Dateiendung:
    $ext = "*.pcf"

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Textanfang (links) in der Datei suchen und dadrünter neuen Text einfügen
    Dim $aText_Insert[2][2] = [ _
    ["MS_DESIGNSEED =", "%lock MS_DESIGNSEED"], _
    ["MS_SEEDFILES =", "# Verzeichnis der Seeddateien"] _
    ]

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Textanfang (links) in der Datei suchen und dann die ganze Zeile löschen
    Dim $aText_Delete[1][2] = [ _
    ["MS_COMPRESS_OPTIONS", "MS_LEVEL_EDIT_NESTED_ATTACHMENT_LEVELS"] _
    ]

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Textanfang (links) in der Datei suchen und dann mit neuem Text ersetzen
    Dim $aText_Replace[1][2] = [ _
    ["MS_OTWREG_NOCHECK = 1", "MS_OTWREG_NOCHECK = 0"] _
    ]

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Text am Ende der Datei einfügen
    Dim $aText_New[2] = [ _
    "MS_OPENDESIGNFILEFILTER = *.dgn", _
    "MS_REF_DEFAULTSETTINGS = saveRelativePath=0,ignoreWhenNesting=0" _
    ]

    [/autoit] [autoit][/autoit] [autoit]

    $aFiles = _GetFilesFolder_Rekursiv($sPfad, $ext, 0)
    If StringRight($sPfad, 1) = "\" Then $sPfad &= "\"
    If Not FileExists($sPfad & "_Repl") Or Not StringInStr(FileGetAttrib($sPfad & "_Repl"), "D", 1) Then DirCreate($sPfad & "_Repl")
    $sRepl = $sPfad & "_Repl\"

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aFiles[0]
    $sRead = FileRead($aFiles[$i])
    $sFileName = StringRegExp($aFiles[$i],"(?<=\\)[^\\]+$",3)
    IF not @error Then $sFileName = $sFileName[0]

    [/autoit] [autoit][/autoit] [autoit]

    For $ins = 0 To UBound($aText_Insert) - 1 ;~ Textanfang (links) in der Datei suchen und dadrünter neuen Text einfügen
    $sRead = StringRegExpReplace($sRead, "(^" & $aText_Insert[$ins][0] & ".+)", "$1\n" & $aText_Insert[$ins][1])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $del = 0 To UBound($aText_Delete) - 1 ;~ Textanfang (links) in der Datei suchen und dann die ganze Zeile löschen
    $sRead = StringRegExpReplace($sRead, "(^" & $aText_Delete[$del][0] & ".+)", "")
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $rep = 0 To UBound($aText_Replace) - 1 ;~ Textanfang (links) in der Datei suchen und dann mit neuem Text ersetzen
    $sRead = StringRegExpReplace($sRead, "(^" & $aText_Replace[$rep][0] & ")", $aText_Replace[$rep][1])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $new = 0 To UBound($aText_New) - 1 ;~ Text am Ende der Datei einfügen
    $sRead &= @CRLF & $aText_New[$new]
    Next
    FileWrite($sRepl&$sFileName,$sRead)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0')
    ;BugFix @ http://www.autoit.de
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

    [/autoit] [autoit][/autoit] [autoit]

    Func _ShowSubFolders($Folder, $ext = '*', $Dir = -1, $Delim = @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $ext <> '*' Then
    If StringRight($file.Name, StringLen($ext)) = $ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $ext, $Dir, $Delim)
    Next
    EndFunc ;==>_ShowSubFolders

    [/autoit]
    • Offizieller Beitrag

    - alle Dateien (kpl. Pfad) in ein Array einlesen (das schaffst du allein ;) )
    - in einer Schleife das Array durcharbeiten mit folgendem Code (ungetestet, aber sollte laufen)

    Spoiler anzeigen
    [autoit]

    $fh = FileOpen('Dateipfad', 0)
    $read = FileRead($fh)
    FileClose($fh)

    [/autoit] [autoit][/autoit] [autoit]

    $read = StringRegExpReplace($read, '(^MS_DESIGNSEED\s=.*\r\n)', '$1' & "%lock MS_DESIGNSEED" & @CRLF)
    $read = StringRegExpReplace($read, '(^MS_SEEDFILES\s=.*\r\n)', '$1' & "# Verzeichnis der Seeddateien" & @CRLF)
    $read = StringRegExpReplace($read, '(^MS_COMPRESS_OPTIONS.*\r\n)', '')
    $read = StringRegExpReplace($read, '(^MS_LEVEL_EDIT_NESTED_ATTACHMENT_LEVELS.*\r\n)', '')
    $read = StringRegExpReplace($read, '(^MS_OTWREG_NOCHECK\s=\s)(1)(.*\r\n)', '$10$3')
    $read &= _
    "MS_OPENDESIGNFILEFILTER = *.dgn" & @CRLF
    "MS_REF_DEFAULTSETTINGS = saveRelativePath=0,ignoreWhenNesting=0" & @CRLF

    [/autoit] [autoit][/autoit] [autoit]

    $fh = FileOpen('Dateipfad', 2)
    FileWrite($fh, $read)
    FileClose($fh)

    [/autoit]
  • Schau mal ob da noch fehler drin sind:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    ;~ Pfad, wo die *.PCF-Dateien liegen
    $sPfad = "C:\Users\Shkal\Desktop\Schulung"
    ;~ Nur für die Dateiendung:
    $ext = "pcf"

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Textanfang (links) in der Datei suchen und dadrünter neuen Text einfügen
    Dim $aText_Insert[2][2] = [ _
    ["MS_DESIGNSEED =", "%lock MS_DESIGNSEED"], _
    ["MS_SEEDFILES =", "# Verzeichnis der Seeddateien"] _
    ]

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Textanfang (links) in der Datei suchen und dann die ganze Zeile löschen
    Dim $aText_Delete[1][2] = [ _
    ["MS_COMPRESS_OPTIONS", "MS_LEVEL_EDIT_NESTED_ATTACHMENT_LEVELS"] _
    ]

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Textanfang (links) in der Datei suchen und dann mit neuem Text ersetzen
    Dim $aText_Replace[1][2] = [ _
    ["MS_OTWREG_NOCHECK = 1", "MS_OTWREG_NOCHECK = 0"] _
    ]

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Text am Ende der Datei einfügen
    Dim $aText_New[2] = [ _
    "MS_OPENDESIGNFILEFILTER = *.dgn", _
    "MS_REF_DEFAULTSETTINGS = saveRelativePath=0,ignoreWhenNesting=0" _
    ]

    [/autoit] [autoit][/autoit] [autoit]

    $aFiles = _GetFilesFolder_Rekursiv($sPfad, $ext, 0)
    If StringRight($sPfad, 1) = "\" Then $sPfad = StringTrimRight($sPfad, 1)
    If Not FileExists($sPfad & "_Repl") Or Not StringInStr(FileGetAttrib($sPfad & "_Repl"), "D", 1) Then DirCreate($sPfad & "_Repl")
    $sRepl = $sPfad & "_Repl\"
    ;~ ConsoleWrite($sRepl & @CRLF)
    ;~ _ArrayDisplay($aFiles)
    For $i = 1 To $aFiles[0]
    $sRead = FileRead($aFiles[$i])
    $sFileName = StringRegExp($aFiles[$i], "(?<=\\)[^\\]+$", 3)
    If Not @error Then $sFileName = $sFileName[0]

    [/autoit] [autoit][/autoit] [autoit]

    For $ins = 0 To UBound($aText_Insert) - 1 ;~ Textanfang (links) in der Datei suchen und dadrünter neuen Text einfügen
    $sRead = StringRegExpReplace($sRead, "(\s*" & _RegExp_Escape($aText_Insert[$ins][0]) & ".+)", "$1" & @CRLF & $aText_Insert[$ins][1] & @CRLF)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $del = 0 To UBound($aText_Delete) - 1 ;~ Textanfang (links) in der Datei suchen und dann die ganze Zeile löschen
    $sRead = StringRegExpReplace($sRead, "(\s*" & _RegExp_Escape($aText_Delete[$del][0]) & ".+)", "")
    ;~ ConsoleWrite(@extended & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $rep = 0 To UBound($aText_Replace) - 1 ;~ Textanfang (links) in der Datei suchen und dann mit neuem Text ersetzen
    $sRead = StringRegExpReplace($sRead, "(\s*" & _RegExp_Escape($aText_Replace[$rep][0]) & ")", $aText_Replace[$rep][1])
    ;~ ConsoleWrite(@extended & @CRLF)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $new = 0 To UBound($aText_New) - 1 ;~ Text am Ende der Datei einfügen
    $sRead &= @CRLF & $aText_New[$new]
    ;~ ConsoleWrite(@extended & @CRLF)
    Next
    If FileExists($sRepl & $sFileName) Then FileDelete($sRepl & $sFileName)
    FileWrite($sRepl & $sFileName, $sRead)
    If Not @error Then ConsoleWrite($aFiles[$i] & @TAB & @TAB & "->" & @TAB & $sRepl & $sFileName & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0')
    ;BugFix @ http://www.autoit.de
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

    [/autoit] [autoit][/autoit] [autoit]

    Func _ShowSubFolders($Folder, $ext = '*', $Dir = -1, $Delim = @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $ext <> '*' Then
    If StringRight($file.Name, StringLen($ext)) = $ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $ext, $Dir, $Delim)
    Next
    EndFunc ;==>_ShowSubFolders

    [/autoit] [autoit][/autoit] [autoit]

    Func _RegExp_Escape($sString)
    $aSplit = StringSplit($sString, "", 2)
    $sRet = ""
    For $i = 0 To UBound($aSplit) - 1
    If StringRegExp($aSplit[$i], "^[\w ]$") Then
    $sRet &= $aSplit[$i]
    Else
    $sRet &= "\" & $aSplit[$i]
    EndIf
    Next
    ;~ ConsoleWrite($sRet & @CRLF)
    Return $sRet
    EndFunc ;==>_RegExp_Escape

    [/autoit]

    Ich habe die Datei kurz überflogen, aber konnte nicht ganz identifiziern was nun wirklich reingehört ^^

    • Offizieller Beitrag

    Mit Muster ist es wesentlich besser, dann klappts auch mit dem Nachbarn ;)

    Spoiler anzeigen
    [autoit]

    $path = '..\Schulung_13.pcf'
    $fh = FileOpen($path, 0)
    $read = FileRead($fh)
    FileClose($fh)

    [/autoit] [autoit][/autoit] [autoit]

    $read = StringRegExpReplace($read, '(\s\sMS_DESIGNSEED\s=.*\r\n)', '$1' & " %lock MS_DESIGNSEED" & @CRLF)
    $read = StringRegExpReplace($read, '(\s\sMS_SEEDFILES\s=.*\r\n)', '$1' & " # Verzeichnis der Seeddateien" & @CRLF)
    $read = StringRegExpReplace($read, '(\s\sMS_COMPRESS_OPTIONS.*\r\n)', '')
    $read = StringRegExpReplace($read, '(\s\sMS_LEVEL_EDIT_NESTED_ATTACHMENT_LEVELS.*\r\n)', '')
    $read = StringRegExpReplace($read, '(\s\sMS_OTWREG_NOCHECK\s=\s)(1)(.*\r\n)', '$10$3')
    $read &= _
    "MS_OPENDESIGNFILEFILTER = *.dgn" & @CRLF & _
    "MS_REF_DEFAULTSETTINGS = saveRelativePath=0,ignoreWhenNesting=0" & @CRLF

    [/autoit] [autoit][/autoit] [autoit]

    $fh = FileOpen($path, 2)
    FileWrite($fh, $read)
    FileClose($fh)

    [/autoit]
  • SEuBo: von vier Aktionen wurde nur die letzte (Text am Ende der Datei einfügen) erfolgreich ausgeführt. Wieso der Rest nicht? ;)

    BugFix : funktioniert prima. :thumbup:
    Lässt sich dies in deine Script einbauen?

    [autoit]

    ;~ Pfad, wo die *.PCF-Dateien liegen
    $sPfad = "c:\admin_V8\config\project_config"
    ;~ Nur für die Dateiendung:
    $ext = "*.pcf"

    [/autoit]

    Danke an alle !!!

  • SEuBo: von vier Aktionen wurde nur die letzte (Text am Ende der Datei einfügen) erfolgreich ausgeführt. Wieso der Rest nicht? ;)

    Weil ich n bissl neben mir stehe und total verwurschtelte RegExe baue..
    Hab das von Bugfix mal bei mir eingebaut :D

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    ;~ Pfad, wo die *.PCF-Dateien liegen
    $sPfad = "C:\Users\Shkal\Desktop\Schulung"
    ;~ Nur für die Dateiendung:
    $ext = "*.pcf"

    [/autoit] [autoit][/autoit] [autoit]

    If StringRight($sPfad, 1) <> "\" Then $sPfad &= "\"
    $aFiles = _FileListToArray($sPfad, $ext)

    [/autoit] [autoit][/autoit] [autoit]

    If @error Then
    MsgBox(64,"","Fehler. Keine Dateien gefunden")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $sPfad = StringTrimRight($sPfad,1)

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists($sPfad & "_Repl") Or Not StringInStr(FileGetAttrib($sPfad & "_Repl"), "D", 1) Then DirCreate($sPfad & "_Repl")
    $sRepl = $sPfad & "_Repl\"

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aFiles[0]
    $sRead = FileRead($aFiles[$i])
    $sFileName = $aFiles[$i]
    ConsoleWrite($aFiles[$i] & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $sRead = StringRegExpReplace($sRead, '(^MS_DESIGNSEED\s=.*\r\n)', '$1' & "%lock MS_DESIGNSEED" & @CRLF)
    $sRead = StringRegExpReplace($sRead, '(^MS_SEEDFILES\s=.*\r\n)', '$1' & "# Verzeichnis der Seeddateien" & @CRLF)
    $sRead = StringRegExpReplace($sRead, '(^MS_COMPRESS_OPTIONS.*\r\n)', '')
    $sRead = StringRegExpReplace($sRead, '(^MS_LEVEL_EDIT_NESTED_ATTACHMENT_LEVELS.*\r\n)', '')
    $sRead = StringRegExpReplace($sRead, '(^MS_OTWREG_NOCHECK\s=\s)(1)(.*\r\n)', '$10$3')
    $sRead &= _
    "MS_OPENDESIGNFILEFILTER = *.dgn" & @CRLF & _
    "MS_REF_DEFAULTSETTINGS = saveRelativePath=0,ignoreWhenNesting=0" & @CRLF

    [/autoit] [autoit][/autoit] [autoit]

    FileWrite($sRepl & $sFileName, $sRead)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    • Offizieller Beitrag

    Irgendwas fehlt noch

    Er hat die falschen RegEx-Lösungen verwendet. Die letzte gepostete Version funktioniert.
    Die AutoIt-Regex-Engine hat 'ne Macke: Anfang String ODER nach Zeilenumbruch wird normalerweise mit "^" maskiert. In der AutoIt eigenen Engine wird das aber als Stringanfang interpretiert. Daher hatte ich das anfangs auch falsch.

  • Ich sag ja.. irgendwas stimmt nicht mit mir... Ich bin total von der Socke heute.
    Das ist bestimmt die Karnevalsstimmung die langsam aufkommt :D

    Jetzt aber! ²
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    ;~ Pfad, wo die *.PCF-Dateien liegen
    $sPfad = "C:\Users\Shkal\Desktop\Schulung"
    ;~ Nur für die Dateiendung:
    $ext = "*.pcf"

    [/autoit] [autoit][/autoit] [autoit]

    If StringRight($sPfad, 1) <> "\" Then $sPfad &= "\"
    $aFiles = _FileListToArray($sPfad, $ext)

    [/autoit] [autoit][/autoit] [autoit]

    If @error Then
    MsgBox(64,"","Fehler. Keine Dateien gefunden")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $sPfad = StringTrimRight($sPfad,1)

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists($sPfad & "_Repl") Or Not StringInStr(FileGetAttrib($sPfad & "_Repl"), "D", 1) Then DirCreate($sPfad & "_Repl")
    $sRepl = $sPfad & "_Repl\"

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aFiles[0]
    $sRead = FileRead($sPfad&"\"&$aFiles[$i])
    $sFileName = $aFiles[$i]
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_DESIGNSEED\s=.*\r\n)', '$1' & " %lock MS_DESIGNSEED" & @CRLF)
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_SEEDFILES\s=.*\r\n)', '$1' & " # Verzeichnis der Seeddateien" & @CRLF)
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_COMPRESS_OPTIONS.*\r\n)', '')
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_LEVEL_EDIT_NESTED_ATTACHMENT_LEVELS.*\r\n)', '')
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_OTWREG_NOCHECK\s=\s)(1)(.*\r\n)', '$10$3')
    $sRead &= _
    "MS_OPENDESIGNFILEFILTER = *.dgn" & @CRLF & _
    "MS_REF_DEFAULTSETTINGS = saveRelativePath=0,ignoreWhenNesting=0" & @CRLF

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If FileExists($sRepl & $sFileName) Then FileDelete($sRepl & $sFileName)
    FileWrite($sRepl & $sFileName, $sRead)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Es ist immer gut, wenn die Stimmung da ist 8)
    Jetzt funktioniert es :thumbup:

    Zwei Sachen noch:
    1. Was muss ich rausnehmen, damit der Ordner _Repl nicht erstellt wird. Die Änderungen sollen direkt in $sPfad ausgeführt werden?
    2. Bei der letzte Aktion "Einfügen am Ende der Datei" soll vorher eine leere Zeile eingefügt werden. Was muss ich in der AU3-Datei hinzufügen?

    Vielen Dank!

    Gruß,
    Dino

    • Offizieller Beitrag

    Das geht dann so:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    ;~ Pfad, wo die *.PCF-Dateien liegen
    $sPfad = "C:\Users\Shkal\Desktop\Schulung"
    ;~ Nur für die Dateiendung:
    $ext = "*.pcf"

    [/autoit] [autoit][/autoit] [autoit]

    If StringRight($sPfad, 1) <> "\" Then $sPfad &= "\"
    $aFiles = _FileListToArray($sPfad, $ext)
    If @error Then
    MsgBox(64,"","Fehler. Keine Dateien gefunden")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $sPfad = StringTrimRight($sPfad,1)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aFiles[0]
    $fh = FileOpen($sPfad & "\" & $aFiles[$i], 0)
    $read = FileRead($fh)
    FileClose($fh)
    $sFileName = $aFiles[$i]
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_DESIGNSEED\s=.*\r\n)', '$1' & " %lock MS_DESIGNSEED" & @CRLF)
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_SEEDFILES\s=.*\r\n)', '$1' & " # Verzeichnis der Seeddateien" & @CRLF)
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_COMPRESS_OPTIONS.*\r\n)', '')
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_LEVEL_EDIT_NESTED_ATTACHMENT_LEVELS.*\r\n)', '')
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_OTWREG_NOCHECK\s=\s)(1)(.*\r\n)', '$10$3')
    $sRead &= _
    @CRLF & _
    "MS_OPENDESIGNFILEFILTER = *.dgn" & @CRLF & _
    "MS_REF_DEFAULTSETTINGS = saveRelativePath=0,ignoreWhenNesting=0" & @CRLF
    $fh = FileOpen($sPfad & "\" & $aFiles[$i], 2)
    FileWrite($fh, $sRead)
    FileClose($fh)
    Next

    [/autoit]

    Noch als Randbemerkung: Dass man FileRead/ -Write auch ohne Filehandle verwenden kann, heisst nicht, dass man das auch tun muss.
    Ich persönlich finde, es ist einfach besserer Stil eine Datei sauber zu öffnen und zu schließen. ;)

  • Hi BugFix,

    bekomme diese Meldung:

    • Offizieller Beitrag

    Copy & Paste - Fehler von mir ;)

    Spoiler anzeigen
    [autoit]

    For $i = 1 To $aFiles[0]
    $fh = FileOpen($sPfad & "\" & $aFiles[$i], 0)
    $sRead = FileRead($fh)
    FileClose($fh)
    $sFileName = $aFiles[$i]
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_DESIGNSEED\s=.*\r\n)', '$1' & " %lock MS_DESIGNSEED" & @CRLF)
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_SEEDFILES\s=.*\r\n)', '$1' & " # Verzeichnis der Seeddateien" & @CRLF)
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_COMPRESS_OPTIONS.*\r\n)', '')
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_LEVEL_EDIT_NESTED_ATTACHMENT_LEVELS.*\r\n)', '')
    $sRead = StringRegExpReplace($sRead, '(\s\sMS_OTWREG_NOCHECK\s=\s)(1)(.*\r\n)', '$10$3')
    $sRead &= _
    @CRLF & _
    "MS_OPENDESIGNFILEFILTER = *.dgn" & @CRLF & _
    "MS_REF_DEFAULTSETTINGS = saveRelativePath=0,ignoreWhenNesting=0" & @CRLF
    $fh = FileOpen($sPfad & "\" & $aFiles[$i], 2)
    FileWrite($fh, $sRead)
    FileClose($fh)
    Next

    [/autoit]
  • noch eine letzte Kleinigkeit ;)

    Hier hackt es noch: $sRead = StringRegExpReplace($sRead, '(\s\sMS_OTWREG_NOCHECK\s=\s)(1)(.*\r\n)', '$10$3')
    MS_OTWREG_NOCHECK = 1 wird duch nichts (leer) ersetzt.
    Richtig wäre MS_OTWREG_NOCHECK = 0