VBScript - Suchen und Ersetzen - String in Datei durch einen Teil des Dateinamens ersetzen
Hallo zusammen,
tut mir leid, dass ich einen neuen Beitrag zu einem strapazierten Thema verfasse, aber die vorhandenen Threads reichen wirgendwie nicht aus, um mich auf den richtigen Weg zu bringen. Zumindest die Kombination aus variablen Dateinamen und variablen Strings zum Ersetzen habe ich bisher noch nicht gefunden. Habe parallel dazu einen identischen Thread in der Rubrik Batch & Shell, glaube aber, dass dies wohl einfacher in VBScript zu lösen ist.
Folgendes Problem:
Es existiert ein Verzeichnis mit mehreren hundert Dateien. Das Namensschema der Dateien sieht wie folgt aus (Eckige Klammern nur zur Veranschaulichung):
"User#[ID] on [ID] at [Date] for Machine.gz" --> [ID] & [Date] sind dynamisch, ansonsten statischer Aufbau
Innerhalb jeder Datei existiert ein Abschnitt "BIOS SERIAL NUMBER="[SERIAL]" --> [SERIAL] ist dynamisch
Diese Seriennummer möchte ich gern durch den Wert der [ID] aus dem Dateinamen ersetzen. Die Seriennummer kann dabei auch aus einem Leerzeichen bestehen.
Vom Ansatz her würde ich:
1. Im Dateinamen den Wert zwischen "#" und dem nächsten Leerzeichen in eine Variable ID legen
2. DIe Datei öffnen
3. Innerhalb der Datei nach "BIOS SERIAL NUMBER=" suchen
4. Den folgenden String bis zum nächsten Anführungszeichen durch ID ersetzen
5. Die Datei speichern
Leider fehlen mir die VB-Scripting Kenntnisse dazu.
Kann jemand helfen?
Vielen Dank und beste Grüße,
LE-Tarantino
tut mir leid, dass ich einen neuen Beitrag zu einem strapazierten Thema verfasse, aber die vorhandenen Threads reichen wirgendwie nicht aus, um mich auf den richtigen Weg zu bringen. Zumindest die Kombination aus variablen Dateinamen und variablen Strings zum Ersetzen habe ich bisher noch nicht gefunden. Habe parallel dazu einen identischen Thread in der Rubrik Batch & Shell, glaube aber, dass dies wohl einfacher in VBScript zu lösen ist.
Folgendes Problem:
Es existiert ein Verzeichnis mit mehreren hundert Dateien. Das Namensschema der Dateien sieht wie folgt aus (Eckige Klammern nur zur Veranschaulichung):
"User#[ID] on [ID] at [Date] for Machine.gz" --> [ID] & [Date] sind dynamisch, ansonsten statischer Aufbau
Innerhalb jeder Datei existiert ein Abschnitt "BIOS SERIAL NUMBER="[SERIAL]" --> [SERIAL] ist dynamisch
Diese Seriennummer möchte ich gern durch den Wert der [ID] aus dem Dateinamen ersetzen. Die Seriennummer kann dabei auch aus einem Leerzeichen bestehen.
Vom Ansatz her würde ich:
1. Im Dateinamen den Wert zwischen "#" und dem nächsten Leerzeichen in eine Variable ID legen
2. DIe Datei öffnen
3. Innerhalb der Datei nach "BIOS SERIAL NUMBER=" suchen
4. Den folgenden String bis zum nächsten Anführungszeichen durch ID ersetzen
5. Die Datei speichern
Leider fehlen mir die VB-Scripting Kenntnisse dazu.
Kann jemand helfen?
Vielen Dank und beste Grüße,
LE-Tarantino
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 133172
Url: https://administrator.de/contentid/133172
Ausgedruckt am: 26.11.2024 um 11:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo LE-Tarantino und willkommen im Forum!
Mit einer kleinen Abweichung von Deinem Ansatz (wenn die ID auch verlässlich zwischen dem zweiten und dritten Leerzeichen des Dateinamens zu finden ist, lässt sie sich so leichter auslesen) könnte das etwa so gehen:
In dieser Fassung werden alle Dateien des Verzeichnisses bearbeitet. Nur wenn die Ersetzung erfolgen konnte, wird die jeweilige Datei neu geschrieben. Bitte Testdaten verwenden, da keine Sicherungskopien erstellt werden.
Gesucht wird exakt (also auch hinsichtlich der Großschreibung) nach "BIOS SERIAL NUMBER=". Wenn die Zeile gefunden wurde, erfolgt keine "Ersetzung" im eigentlichen Sinn, sondern die Zeile wird neu erstellt, indem an den Suchbegriff ein Anführungszeichen, die ID und ein weiteres Anführungszeichen angefügt werden.
Grüße
bastla
Mit einer kleinen Abweichung von Deinem Ansatz (wenn die ID auch verlässlich zwischen dem zweiten und dritten Leerzeichen des Dateinamens zu finden ist, lässt sie sich so leichter auslesen) könnte das etwa so gehen:
Folder = "D:\Verzeichnis"
LookFor = "BIOS SERIAL NUMBER="
LL = Len(LookFor)
Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(Folder).Files
ID = Split(File.Name)
Lines = Split(File.OpenAsTextStream(1).ReadAll, vbCrLf)
ToWrite = False
For i = 0 To UBound(Lines)
If Left(Lines(i), LL) = LookFor Then
Lines(i) = LookFor & Chr(34) & ID(2) & Chr(34)
ToWrite = True
Exit For
End If
Next
If ToWrite Then fso.CreateTextFile(File.Path).Write Join(Lines, vbCrLf)
Next
Gesucht wird exakt (also auch hinsichtlich der Großschreibung) nach "BIOS SERIAL NUMBER=". Wenn die Zeile gefunden wurde, erfolgt keine "Ersetzung" im eigentlichen Sinn, sondern die Zeile wird neu erstellt, indem an den Suchbegriff ein Anführungszeichen, die ID und ein weiteres Anführungszeichen angefügt werden.
Grüße
bastla
Hallo Ihr 2,
ich habe eine ähnliche Problem, ich möchte einen Ordner durchlaufen und in allen darin enthaltenen Dateien die Zeichen Sounds durch 04_Sounds ersetzen.
Dazu habe ich dein Script so angepasst:
Ich habe nur das Problem, dass es immer nur das erste Vorkommen von "Sounds" ersetzt aber nicht die nachfolgenden, daher habe ich zum einen versucht die Split Anweisung durch -1 anzupassen oder die Abbruchbedingung der For-Schliefe, nur ich komme nicht weiter. Bin leider noch ein VBS Noob.
Wie passe ich den Code richtig an?
So sehen übrigens die zu ändernden Dateien aus, es handelt sich um Playlisten.
Danke schonmal
Gruß Meho
ich habe eine ähnliche Problem, ich möchte einen Ordner durchlaufen und in allen darin enthaltenen Dateien die Zeichen Sounds durch 04_Sounds ersetzen.
Dazu habe ich dein Script so angepasst:
Folder = "E:\04_Sounds\Playlists\HuggaBugga\Neuer Ordner"
LookFor = "Sound"
ersetze = "04_Sounds"
LL = Len(LookFor)
Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(Folder).Files
Lines = Split(File.OpenAsTextStream(1).ReadAll, "\",-1)
ToWrite = False
For i = 0 To UBound(Lines)
If Left(Lines(i), LL) = LookFor Then
Lines(i) = ersetze
ToWrite = True
Exit For
End If
Next
If ToWrite Then fso.CreateTextFile(File.Path).Write Join(Lines, "\")
Next
Ich habe nur das Problem, dass es immer nur das erste Vorkommen von "Sounds" ersetzt aber nicht die nachfolgenden, daher habe ich zum einen versucht die Split Anweisung durch -1 anzupassen oder die Abbruchbedingung der For-Schliefe, nur ich komme nicht weiter. Bin leider noch ein VBS Noob.
Wie passe ich den Code richtig an?
So sehen übrigens die zu ändernden Dateien aus, es handelt sich um Playlisten.
#EXTM3U
#EXTINF:171,Interpret
\Sounds\Alben\Verzeichnis\09 - Interpret.mp3
#EXTINF:137,Interpret- AudioTrack 03
\Sounds\Alben\Verzeichnis\03-AudioTrack 03.mp3
#EXTINF:260,Interpret - AudioTrack 07
\Sounds\Alben\Verszeichnis\Interpret - AudioTrack 07.mp3
#EXTINF:203,10 Titel 10
Danke schonmal
Gruß Meho
Hallo Mehonidas!
Wenn Du ohnehin durchgängig ersetzen willst, musst Du die Dateien nicht zeilenweise abarbeiten - das sollte etwa so gehen:
Zur Sicherheit habe ich den Such- bzw Ersetzungs-Begriff etwas genauer (mit "\" davor und danach) formuliert - so werden nicht Ersetzungen innerhalb von zB Dateinamen vorgenommen. Du solltest aber trotzdem vorweg mit Kopien testen ...
Grüße
bastla
Wenn Du ohnehin durchgängig ersetzen willst, musst Du die Dateien nicht zeilenweise abarbeiten - das sollte etwa so gehen:
Folder = "E:\04_Sounds\Playlists\HuggaBugga\Neuer Ordner"
LookFor = "\Sounds\"
ReplaceBy = "\04_Sounds\"
Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(Folder).Files
T = fso.OpenTextFile(File.Path).ReadAll
fso.CreateTextFile(File.Path).Write Replace(T, LookFor, ReplaceBy)
Next
Grüße
bastla