Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch - Suchen und Ersetzen - Variablen String durch einen Teil eines variablen Dateinamens ersetzen

Frage Entwicklung Batch & Shell

Mitglied: LE-Tarantino

LE-Tarantino (Level 1) - Jetzt verbinden

11.01.2010, aktualisiert 18.10.2012, 13529 Aufrufe, 2 Kommentare

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
Mitglied: Biber
11.01.2010 um 20:45 Uhr
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
Bitte warten ..
Mitglied: LE-Tarantino
11.01.2010, aktualisiert 18.10.2012
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 ) 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 ) 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 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

http://www.administrator.de/forum/vbscript-suchen-und-ersetzen-string-i ...
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Suchen, Ersetzen und Entfernen von Dateiinhalten auf Textbasis (1)

Frage von DanteManor zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell String Suchen mit Wildcard und Ersetzen (6)

Frage von herrmanndominic zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...