le-tarantino
Goto Top

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

Content-ID: 133172

Url: https://administrator.de/contentid/133172

Ausgedruckt am: 26.11.2024 um 11:11 Uhr

bastla
bastla 11.01.2010 um 18:18:45 Uhr
Goto Top
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:
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
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
LE-Tarantino
LE-Tarantino 11.01.2010 um 23:42:17 Uhr
Goto Top
Hi Bastia,

vielen Dank dafür!

Funktioniert 1a.. besonders die Idee mit dem ID = Split(File.Name) find ich klasse!
bastla
bastla 12.01.2010 um 15:53:03 Uhr
Goto Top
Hallo LE-Tarantino!

Freut mich, wenn's für Dich passt. face-smile
besonders die Idee mit dem ID = Split(File.Name) find ich klasse!
Der Dank hierfür gilt den MS-Programmierern (in VB5 gab's "Split()" noch gar nicht face-wink) ...

Grüße
bastla
Mehonidas
Mehonidas 27.07.2011 um 14:11:18 Uhr
Goto Top
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:

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
bastla
bastla 27.07.2011 um 15:49:31 Uhr
Goto Top
Hallo Mehonidas!

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
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 ... face-wink

Grüße
bastla
Mehonidas
Mehonidas 27.07.2011 um 18:35:28 Uhr
Goto Top
es gibt eine replace Funktion?

°!° schei.. Buch !

Das nächste mal schreib ich gleich ins Forum! ^^

VIELEN VIELEN DANK es funktioniert! face-smile

Gruß Meho