le-tarantino
Goto Top

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

Content-ID: 133130

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

Ausgedruckt am: 26.11.2024 um 13:11 Uhr

Biber
Biber 11.01.2010 um 20:45:23 Uhr
Goto Top
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.

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.
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".
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: von ein paar hundert *.gz-Dateien müssen diese Zeile-für-Zeile-fast-Clones erzeugt, die Originale gelöscht und die Clone umbenannt werden-->ist langsam!
> 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.
-----> Problem könnte bestenfalls sein, dass kein VBSkript benutzt werden darf bei euch.


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
LE-Tarantino
LE-Tarantino 11.01.2010, aktualisiert am 18.10.2012 um 18:40:50 Uhr
Goto Top
Hi Biber,

vielen dank für deine Antwort! Ich hatte schon befürchtet, dass die Dateioperationen mit normalem Batch Scripting nicht umsetzbar sind. Deshalb habe ich im VBScript-Bereich noch einmal die selbe Anfrage gepostet. Mit deiner Antwort und der Antwort aus dem VB Bereich sollte ich jetzt sogar schon in der Lage sein etwas passendes zu basteln (Der Einsatz von VBS ist also kein Problem face-wink ) Ich bin auch schon am überlegen, ob ich nicht einfach ein kleines Tool in VB6 schreib, aber den Aufwand wollte ich eigentlich so gering wie möglich halten.

Zu deiner konzeptionellen Anmerkung:

Der Gesamthintergrund ist der Folgende: Ich führe in einem Unternehmen eine Lizenzprüfung (im Kundenauftrag, nicht BSA face-wink ) durch. Hierzu nutze ich eine Software, die mittels File-, Registry- und WMI Scans die installierte Software ermittelt. Die Ergebnisse werden im (eben nicht losen, aber das war mein Fehler face-smile XML Format erstellt und entsprechend abgelegt. Die Dateigröße der ungepakten XML beträgt etwa 1-2 MB. Sämtliche in ihr enthaltenen Infomationen (Rechnerinventar) sind "erhaltenswert".

Die Dateiendung .gz hatte ich nur beispielhaft verwendet, da die XML (nach der Ersetzung der BIOS Seriennummer) noch gepackt werden. Sorry dafür.

Damit weder Nutzer noch Rechner zurückverfolgt werden können (Stichwort Personalrat und personenbezogene Daten) werden im Laufe des Scanvorgangs alle Rechner- und Nutzernamen durch die zufällige [ID] ersetzt. Diese ist pro Rechner eineindeutig. Die ausgelesene BIOS Seriennummer des Rechners wird vom Lizenzmanagementsystem als identifizierender Schlüssel verwendet. Einige hundert Geräte haben jedoch identische BIOS Seriennummern (in verschiedener Ausprägung, hier haben die OEMs gepennt!). Damit würde das System beim Inventarimport annehmen es handele sich stets um den selben Rechner. Daher will ich diese durch die eineindeutige [ID] ersetzen.

Hoffe ich hab die Problemstellung ein wenig transparenter gemacht.

Viele Grüße und danke für deine Antwort (und die Anregungen, die vllt noch kommen)
LE-Tarantino

EDIT: Die im VBScripting Bereich von Bastia gepostete Lösung funktioniert 1a .. daher hier nochmal fix der Verweis darauf

VBScript - Suchen und Ersetzen - String in Datei durch einen Teil des Dateinamens ersetzen