Lightgreen38 wrote:... (Obwohl ich glaube ich dann noch nicht richtig den Unterschied zwischen Loop, Files und Loop, Parse begriffen habe...) ...
Moin,
Deine Erste Schleife
Code: Select all
Loop, Files, c:\studio\*.sdlxliff, R ; R=recurse into subfolders
filelist := A_LoopFileFullPath
überschreibt bei jedem Durchlauf den Inhalt der Variablen
filelist mit dem aktuellen Inhalt der Variablen
A_LoopFileFullPath. Nach Ende der Schleife enthält
filelist deshalb genau einen Dateipfad, den der letzten gefundenen Datei. Den Listentrenner
| benutzt Du überhaupt nicht.
Deine zweite Schleife
Code: Select all
loop, Parse, filelist, `|
{
; The above parses the list based on the | character
fileread, EmptySegs, %filelist% ; Read the file
...
versucht nun, den Inhalt der Variablen
filelist mit Hilfe des Trennzeichen
| aufzutrennen. Die einzelnen Teile werden dabei in die Variable
A_LoopField gestellt. Die wird dann normalerweise innerhalb der Schleife weiter verarbeitet.
In Deinem Skript enthält die Variable
filelist kein Trennzeichen und damit auch keine Liste von Dateien. Deshalb wird der Variablen
A_LoopField bereits im ersten Durchlauf der komplette Inhalt der Variablen
filelist zugewiesen. Damit ist das auch schon der letzte Durchlauf.
Du verarbeitest nun aber nicht die Variable
A_LoopField sondern die Variable
filelist. Das klappt nur, weil die Variable nur
exakt einen kompletten Dateipfad enthält.
Lange Rede, kurzer Sinn: Dein Zweischleifenkonstrukt (, das Du nicht brauchst,) würde wie folgt funktionieren:
Code: Select all
FileList := ""
Loop, Files, c:\studio\*.sdlxliff, R ; R=recurse into subfolders
FileList .= A_LoopFileFullPath . "|" ; kompletten Pfad der aktuell gefundenen Datei und ein Trennzeichen an FileList anhängen
FileList := RTrim(FileList , "|") ; letztes TRennzeichen am Ende entfernen
loop, Parse, filelist, `|
{
; The above parses the list based on the | character
FileRead, EmptySegs, %A_LoopField% ; Read the file ; <<<< der aktuelle Dateipfad steht in A_LoopField
FileDelete, %A_LoopField% ; Delete the file
EmptySegs := RegExReplace(EmptySegs, " conf=""([a-zA-Z]+)""", "")
FileAppend, %EmptySegs%, %A_LoopField% ; Re-create the file with new contents
}
Return
Für die Verarbeitung der einzelnen Dateien hätte ich einen anderen Vorschlag, das
File-Objekt. Damit kann man Dateien auch
überschreiben:
Code: Select all
Loop, Files, c:\studio\*.sdlxliff, R ; R=recurse into subfolders
{
If (SdlXliff := FileOpen(A_LoopFileFullPath, "rw")) { ; Versuch, die Datei zum Überschreiben zu öffnen
StartPos := SdlXliff.Pos ; Startposition merken, falls die Datei eine BOM hat
EmptySegs := SdlXliff.Read() ; Datei komplett einlesen
EmptySegs := RegExReplace(EmptySegs, " conf=""([a-zA-Z]+)""", "", Counter) ; Text ersetzen und Ersetzer zählen
If (Counter) { ; falls Text ersetzt wurde
SdlXliff.Pos := StartPos ; Datei wieder auf Start setzen
SdlXliff.Write(EmptySegs) ; geänderten Text zurückschreiben
SdlXliff.Length := Handle.Pos ; Dateiende auf aktuelle Größe setzen
}
SdlXliff.Close() ; Datei schließen
}
Else
MsgBox, 16, Fehler!, Die Datei %A_LoopField% konnte nicht geöffnet werden!
}
Ich habe den Code aber nicht selbst getestet.