Batch - Suchen und Ersetzen - Variablen String durch einen Teil eines variablen 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.
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 Batch-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.
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 Batch-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: 133130
Url: https://administrator.de/contentid/133130
Ausgedruckt am: 26.11.2024 um 13:11 Uhr
2 Kommentare
Neuester Kommentar
Moin LE-Tarantino,
willkommen im Forum.
Leider kommt jetzt im ersten Schritt keine out-of-the-box-Lösung von mir, da die Gesamtstrategie insgesamt so nicht umsetzbar ist
Ich versuche es mal aufzudröseln.
Dann steht das Erwünschte in Variable %%j
Somit hätten wir den wichtigen Part "für jede relevante Datei namens bla[%%j]bla.gz" mache etwas mit dem variablen Namensteil %%j
Aber dieses hier von 2-5...:
Bedeutet de facto
- - entweder - -
> Problem 2: Original ist hinterher wech... und ob alle Zeilen Eins-zu-Eins "kopiert" werden konnten ist nicht wirklich prüfbar, da CMD-Batches bei Umlauten, Sonderzeichen rumzicken können. Informationsverlust droht.
-- oder - -
Generell aber finde ich den Plan ohnehin nicht so prickelnd.
Wenn du doch ohnehin diese paar hundert lose strukturierten *.gz durchflöhen willst, um meinetwegen die BIOS-Serialno zuzuordnen....
Warum schreibst du gleich alle (erhaltenswerten) Informationen aus allen *.gz-Dateien neu in eine stringenter strukturierte CSV-oder-so-Datei, damit du dann in einer Datentabelle (DB oder Tabellenkalkulation) alle Jetzt-in-je-einer-Datei-Infos in einer Datei mit allen Infos in je einer Zeile hast?
Grüße
Biber
willkommen im Forum.
Leider kommt jetzt im ersten Schritt keine out-of-the-box-Lösung von mir, da die Gesamtstrategie insgesamt so nicht umsetzbar ist
Ich versuche es mal aufzudröseln.
Zitat von @LE-Tarantino:
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
Vom Ansatz her würde ich:
1. Im Dateinamen den Wert zwischen "#" und dem nächsten Leerzeichen in eine Variable ID legen
Das passt und ist im Batch mit einer Anweisung FOR /F %%i "tokens=2 delims=# " in ('dir "[pfad\]User#*.gz"') do .... machbar.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
Vom Ansatz her würde ich:
1. Im Dateinamen den Wert zwischen "#" und dem nächsten Leerzeichen in eine Variable ID legen
Dann steht das Erwünschte in Variable %%j
Somit hätten wir den wichtigen Part "für jede relevante Datei namens bla[%%j]bla.gz" mache etwas mit dem variablen Namensteil %%j
Aber dieses hier von 2-5...:
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
... das geht (technisch) nicht mit Batch-Befehlen... damit geht nur "Datei zeilenweise lesend verarbeiten" ODER "An (ggf. leere) Datei zeilenweise neues anhängen".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
Bedeutet de facto
- - entweder - -
- mit CMD-Befehlen die Datei bla[%%j]bla.gz lesend durchwackeln
- und Zeile für Zeile identisch in Datei bla[%%j]bla.gz2 schreiben
- Sonderlocke für Zeile "BIOS SERIAL..."
- danach bei Erfolg (soweit feststellbar) Originaldatei *.gz löschen und variierte Kopie *.gz2 umbenamsen in *.gz
> Problem 2: Original ist hinterher wech... und ob alle Zeilen Eins-zu-Eins "kopiert" werden konnten ist nicht wirklich prüfbar, da CMD-Batches bei Umlauten, Sonderzeichen rumzicken können. Informationsverlust droht.
-- oder - -
- das "Ersetzen-in-Originalzeile" macht ein (temporäres) VBSkript-Schnipselchen.
Generell aber finde ich den Plan ohnehin nicht so prickelnd.
Wenn du doch ohnehin diese paar hundert lose strukturierten *.gz durchflöhen willst, um meinetwegen die BIOS-Serialno zuzuordnen....
Warum schreibst du gleich alle (erhaltenswerten) Informationen aus allen *.gz-Dateien neu in eine stringenter strukturierte CSV-oder-so-Datei, damit du dann in einer Datentabelle (DB oder Tabellenkalkulation) alle Jetzt-in-je-einer-Datei-Infos in einer Datei mit allen Infos in je einer Zeile hast?
Grüße
Biber