kaffeepause
Goto Top

Batch, Zeilen aus Textdateien in eine neue schreiben

Ich möchte mehrere Textdateien auswerten, d.h. bestimmte Zeilen extrahieren und zusammen mit Parametern in eine neue schreiben.

Hallo,

zunächst einmal bitte ich um Entschuldigung, weil ich diese Frage poste, obwohl es hier schon zig Beiträge zu Batches gibt, die Textzeilen extrahieren. Aber die Syntax einiger Befehle verwirrt mich immer (delims) und bis jetzt klappt es einfach nicht so, wie ich es gern hätte.

Ich habe eine Startskript geschrieben, welches mir die installierten Programme (Registry-Schlüssel) in eine Datei exportiert. Das funktioniert. Nun habe ich pro Computer eine aktuelle Textdatei mit dem Schlüssel der installierten Programme (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).

Aus diesen möchte ich jeweils die Zeilen extrahieren, in denen der "DisplayName" oder die "DisplayVersion" steht und das dann zusammen mit dem Computernamen (der im Dateinamen steht) in eine gemeinsame Datei schreiben. Als wirklich rudimentäre Softwareinventarisierung. Bitte bietet mir hier keine Software an, mit der ich inventarisieren kann, ich möchte nur die Batch zum Laufen kriegen.

In Deutsch heißt das:
Finde in allen Dateien, die "*_software.log" heißen die Zeilen mit "DisplayName" (und "DisplayVersion") und schreibe diese Zeilen in die Textdatei "Software_Gesamt.log", gefolgt vom Rechnernamen.

Der Rechnername steht immer an Anfang der Log-Datei (computername_software.log).

Also überarbeitet:
Finde in allen Dateien, die "*_software.log" heißen die Zeilen mit "DisplayName" (und "DisplayVersion") und schreibe diese Zeilen in die Textdatei "Gesamt.log", gefolgt von den Zeichen vor dem Unterstrich des aktuellen Dateinamens.


Bis jetzt habe ich nur
findstr "DisplayName" "C:\Temp\*_software.log">>"C:\Temp\Ausgabe\Gesamt.log"  

Der rechnet zwar 1-2 Sekunden, aber die erzeugte Datei (Gesamt.log) ist einfach nur 0 kb und damit leer.

Ein Beispiel für die Zeile, die ich extrahieren möchte. So sieht sie in der Originaldatei aus:
"DisplayName"="Conexant AC-Link Audio"  


Viele Grüße,
Kaffeepause

Content-ID: 131493

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

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

60730
60730 11.12.2009 um 11:14:17 Uhr
Goto Top
moin,

was liefert denn:

findstr "DisplayName" "C:\Temp\*_software.log"  

bist du dir sicher, dass DisplayName tatsächlich in einer Datei *_software.log im Ordner c:\temp drin ist?

Denn wenn es so wäre - müßte die auch angezeigt werden face-wink

Ps: Mit was erzeugst du eigentlich die *_Software.log - wenn das Unicode Dateien sind - findet "find" & co nix....
regedit ? oder reg.exe....

Gruß

edit @tsuki - neee die sind Jacke wie Hose ich tippe auf einen export mit regedit...
TsukiSan
TsukiSan 11.12.2009 um 11:16:36 Uhr
Goto Top
lass mal bei
findstr "DisplayName" "C:\Temp\*_software.log">>"C:\Temp\Ausgabe\Gesamt.log"
die Hochkommas bei
"C:\Temp\*_software.log"
weg.

Gruss
Tsuki

Ps.: ansonsten siehe Timos Antwort
Kaffeepause
Kaffeepause 11.12.2009 um 12:11:09 Uhr
Goto Top
Hallo und danke für die schnelle Antwort.

Ist ein Export mit Regedit, ja.

OK. Ersten Fehler gefunden.
Unicode.
Wandel ich eine Datei in ANSI um, dann klappt es mit FINDSTR.

Argh.

Die Hochkommas sind übrigens nicht relevant.

Jetzt muss ich schauen, ob ich den Befehl
REG EXPORT HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
irgendwie so modifizieren kann, dass dabei nicht Unicode BOM, sondern ANSI rauskommt.

Oder ich hab eben gelitten.
Oder ich finde ein Programm, was mir eine Batchkonvertierung von Textdateien macht.


Nur der Vollständigkeit halber:
Wie haue ich den Rechnernamen in die Zieldatei?
Der Rechnername ergibt sich aus den ersten Zeichen der einzelnen Log-Datei.
Also sowas wie:
Schreib mir alle Zeichen vor "_" der aktuell geöffneten Datei in die Zieldatei.

Viele Grüße,
Kaffeepause
Kaffeepause
Kaffeepause 11.12.2009 um 12:14:25 Uhr
Goto Top
ANSI-Problem gelöst:
statt
REG EXPORT HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

muss ich den hier nehmen:
regedit /a C:\Ausgabe.txt "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"  


Bleibt die Frage, wie ich den aktuellen Dateinamen analysiere und diese Information in der Zieldatei anhänge.
Kaffeepause
Kaffeepause 11.12.2009 um 12:24:33 Uhr
Goto Top
Hmmm. Ok.
Da der FINDSTR-Befehl bei der Ausgabe sowieso den aktuellen Dateinamen VORNE dranschreibt, kann ich damit leben.

Also, ANSI statt UNICODE, die Information hat mir weitergeholfen.

Ich setz das mal auf gelöst.

Schönes Wochenende noch.
Die Kaffeepause
TsukiSan
TsukiSan 11.12.2009 um 13:14:43 Uhr
Goto Top
@ Timo,

du hast natürlich vollkommen Recht!
Ich batche halt zu wenig, mea culpa. Mit oder ohne " geht's.
Danke für den Hinweis!

Gruss
Tsuki
60730
60730 11.12.2009 um 14:26:49 Uhr
Goto Top
Salü,

Nur der Vollständigkeit halber:
Wie haue ich den Rechnernamen in die Zieldatei?

nicht mit dem Hammer face-wink
findstr "DisplayName" "C:\Temp\*_software.log">>"C:\Temp\Ausgabe\Gesamt.log && echo %computername% >>"C:\Temp\Ausgabe\Gesamt.log"  

Gruß
Kaffeepause
Kaffeepause 11.12.2009 um 14:32:00 Uhr
Goto Top
neee, hehe, DAS geht natürlich nicht. Die Batch führe ich ja von MEINEM Rechner aus.
Da wäre %computername% nicht so der Brüller, weil ich ja dann in jeder Zeile meinen Rechner drin hätte.

Aber, wie ich schrieb, schreibt FINDSTR in der Ausgabe den Namen der Quelldatei an den Anfang. Insofern habe ich den Rechnernamen automatisch drin.

Viele Grüße,