Top-Themen

Aktuelle Themen (A bis Z)

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, 13697 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 ..
Ähnliche Inhalte
Batch & Shell
Teil eines Strings als Variable setzen
gelöst Frage von tHe-jAyBatch & Shell2 Kommentare

Hallo, für ein kleines Batch-Script benötige ich einen Servicenamen als Variable. Den Servicenamen frage ich über folgenden Befehl ab: ...

Batch & Shell
In einer Batch-Datei einen variablen Teil eines Dateinamens auslesen
gelöst Frage von dh0815Batch & Shell5 Kommentare

Hallo Leute, das ist mein erster Post hier und ich möchte mich vorab schon dafür entschuldigen, wenn ich etwas ...

Batch & Shell
Batch: Ein Wort suchen und darauf hin einen Teil innerhalb des Strings als Variable setzen
gelöst Frage von flyingmichaelBatch & Shell7 Kommentare

Hallo Zusammen, ich bin im Moment daran ein Batch Script zu schreiben, welches nach Eingabe eines Benutzernamen unser Logilfe ...

Microsoft
Suche und Ersetzen im Dateinamen mit Wildcard?
gelöst Frage von GottfriedKernMicrosoft5 Kommentare

Ich suche ein Programm, dass Dateinamen durchsucht und mittels Platzhalter ersetzen kann. Beispiel: toller - sound (2002).mp3 soll in ...

Neue Wissensbeiträge
Windows 10

Windows 10 Hello-Anmeldung per Foto ausgehebelt

Tipp von kgborn vor 3 StundenWindows 10

Windows Hello ist eine Funktion, um sich per Fingerabdruck-, Gesichts- oder Iriserkennung bei Windows 10-Geräten anzumelden (siehe), setzt aber ...

Perl

Perl hat heute Geburtstag: 30 Jahre Perl: Lange Gesichter zum Geburtstag

Information von Penny.Cilin vor 10 StundenPerl2 Kommentare

Hallo, auch wenn es wenige wissen und noch weniger Leute es nutzen. Perl hat heute Geburtstag. 30 Jahre Perl ...

Sicherheit

Blackberry stirbt - Keine Updates für Priv mehr

Tipp von certifiedit.net vor 11 StundenSicherheit1 Kommentar

Blackberry wird zu einer 08/15 Firma und geht wohl mehr und mehr den Weg, den HTC schon ging. Von ...

Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 2 TagenWindows 1012 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Heiß diskutierte Inhalte
Windows Server
SCCM 2016: PXE Boot des Clients schlägt fehl
Frage von gabeBUWindows Server23 Kommentare

Hallo Zusammen Ich habe eine Testumgebung erstellt um über SCCM 2016 einen virtuellen Client aufzusetzen. Folgende Maschinen habe ich ...

Netzwerkgrundlagen
Belibiges Teilnetz einer Subnetzmaske rausfinden?
gelöst Frage von CenuzeNetzwerkgrundlagen19 Kommentare

Wundervollen Gutentag, mittlerweile kann ich Subnetting so einigermaßen, aber ein Problem habe ich noch. Netzwerkadresse und Boradcast errechnen ist ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless12 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Exchange Server
Exchange empfängt Emails - Kann aber keine Senden
gelöst Frage von niklasschaeferExchange Server11 Kommentare

Hallo, ich stehe gerade bei mir zuhause vor folgender Problemstellung. Gegeben sind 2x Hyper-V Host mit Windows Server 2016 ...