milli2311
Goto Top

Batch Find abwechselnd in txt

Hei Leute,

sagt mal... Ich möchte Werte die Werte der installierten Programme aus der Registry auslesen und dann den Programm-Namen und die Programm-Version jeweils untereinander in eine Text-Datei schreiben..

Mein Script sieht wie folgt aus:
____________________________________________________________________________________________
@echo off

rem Registry-Werte exportieren
regedit /E c:\test.txt "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\uninstall"

rem Displaynamen suchen und in Extra-Datei schreiben
rem Finde DisplayNamen in C:\Test.txt, ignoriere Groß- und Kleinschreibung und schreibe deine Funde in C:\Software.txt
find "displayname" /i c:\test.txt >> C:\software.txt

rem DisplayVersion suchen und in Extra-Datei schreiben
rem Finde DisplayVersion in C:\Test.txt, ignoriere Groß- und Kleinschreibung und schreibe deine Funde in C:\Software.txt
find "displayversion" /i c:\test.txt >> C:\software.txt

rem Die Datei mit den kompletten Werten löschen
rem del c:\test.txt

echo on
____________________________________________________________________________________________

Leider schreibt es mir hier zuerst alle Programme und dann darunter alle Versionen in C:\Software.txt, sodass ich nicht auf den ersten Blick herausfinden kann, welches Programm welche Version vorweist.

Ich möchte also in der Text-Datei abwechselnd:
Programm-Name
Programm-Version
Programm2-Name
Programm2-Version

usw...

Danke für eure Hilfe.

MfG

Milli

Content-Key: 100862

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

Printed on: April 16, 2024 at 13:04 o'clock

Member: AndreasA
AndreasA Nov 03, 2008 at 11:50:22 (UTC)
Goto Top
Hallo Milli2311,

Versuchs einfach mit ner FOR-Schleife und der Query-Option von der reg.exe

Also in etwa so:

set log=C:\Software.txt

echo. >%log%
For /f %%a in ('reg query hklm\software\microsoft\windows\currentversion\uninstall') do (call :process_query %%a)  

goto :eof

:process_query
set KEY=%1
reg query %key% /v Displayname >>%log%
reg query %key% /v DisplayVersion >>%log%
goto :eof

Gruß AndreasA
Member: Biber
Biber Nov 03, 2008 at 11:54:42 (UTC)
Goto Top
Moin Milli2311,

hmmm, Du wirst mit dieser Strategie nur einen kurzen Schein-Erfolg erzielen können.
Es kann kann zuverlässiges/vorhersagbares Ergebnis erzeugt werden, wenn Du zwei optionale Egenschaften eines Objektes in einer meterlangen Liste zuordnen willst.

Oder anders hergeleitet, Du könntest vom CMD-Prompt aus schnell zum "Schein-Ziel" kommen:
>set regkey="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\uninstall"  
>for /f "tokens=2,*" %i in ('reg query %regkey% /s^|findstr /i "Display"') do @echo %j  
....
Microsoft .NET Framework 1.1 German Language Pack
1.4.2
IBM 32-bit Runtime Environment for Java 2, v1.4.2
6.0
...
...aber:
  • "Displayname" und erst recht "DisplayVersion" sind möglicherweise vorgesehen, aber es gibt nun mal in einer Registry keine MUSS-Felder. Manchmal fehlt eins. Oder das andere.
  • Und wenn sie da sind.... dann ist aber die Reihenfolge des Erscheinens beliebig

Demnach bleibt Dir bei einer Find-Suchworte-in-ellenlanger-textdatei-so-wie-se-kommen-Strategie schon nach einem ersten proof-of-concept die Luft aus.

Anderes Werkzeug oder andere Strategie?

Grüße
Biber
Member: Milli2311
Milli2311 Nov 03, 2008 at 11:59:51 (UTC)
Goto Top
Hei Danke euch erst mal für eure Mühe.

Leider verstehe ich nicht halb so viel von Batch wie ich gern möchte..

Die Sache ist auch nicht dringend, bin durch Zufall drauf gestoßen und dachte, es wäre schön, endlich mal eine Übersicht über die hier installierten Programme zu bekommen... (Fast jeder hat irgendwelche "Sonder-Programme" installiert)

Hättet ihr vllt. eine Idee, wie ich das ganze sonst machen könnte?

Vielen Dank

MfG
Milli
Member: Biber
Biber Nov 03, 2008 at 12:51:31 (UTC)
Goto Top
Moin Milli1311,

die Lösung von AndreasA ist in etwa die, zu der ich Dich ermuntern wollte - die hatte ich vorhin noch nicht gesehen, als ich meinen Kommentar abgeschickt hatte.
Ich würde noch nach den beiden "reg query"-Zeilen in der ":process_query" ein "echo ----->>%log%" ergänzen, um wirklich hinterher definitiv erkennen zu können, welche Namen/Version zusammengehören.

Ansonsten sollte Deine Anforderung damit gelöst sein.

Grüße
Biber
Member: Milli2311
Milli2311 Nov 03, 2008 at 13:05:30 (UTC)
Goto Top
Vielen Dank es funktioniert face-smile

Könnte mir einer von euch beiden eventuell noch erklären, was jetzt wozu gut war? Lach

Oder finde ich das in irgendeinem Anfänger-Tutorial? face-wink
ich mein "set log=C:\Software.txt" is klar.. um die Variable zu setzen.

aber wieso ist nach dem Echo ein . ?
echo. >%log%

und wie funktioniert das mit dem For... Ich hab heut 5 Seiten dazu durchgelesen, aber das nie kapiert face-sad Wie würde man das denn sinngemäß lesen?

"Für jedes Teil in dem Registry-Eintrag, führe die Schritte unter process query aus?"
For /f %%a in ('reg query hklm\software\microsoft\windows\currentversion\uninstall') do (call :process_query %%a)

goto :eof

:process_query

das %1 steht doch bloß für eine Variable, die man vergeben kann oder? Wozu gibt es denn immer die vielen %
set KEY=%1
reg query %key% /v Displayname >>%log%
reg query %key% /v DisplayVersion >>%log%
goto :eof


Ok sorry, falls es zu viele Anfängerfragen sind xD Aber was genau tut der Befehl nun face-smile

Danke sehr. Sagt mir Bescheid, wenn ich zu viel gefragt hab und lieber woanders nachlesen sollte face-smile

Vielen Dank im Voraus

MfG
Milli
Member: Biber
Biber Nov 03, 2008 at 16:22:23 (UTC)
Goto Top
Moin Milli2311,

Vielen Dank es funktioniert
DAS ist doch schon mal ein Anfang.... face-wink

Könnte mir einer von euch beiden eventuell noch erklären, was jetzt wozu gut war? Lach
Ich versuche es.
Oder finde ich das in irgendeinem Anfänger-Tutorial?
Ein paar Tutorials und ebenso einige wenige handverlesene Links findest Du
hier im Forum im Berech "Batch & Shell".

Und ein paar Hundert gestellte Batch-Fragen, die mittlerweile mehrheitlich einen kleinen grünen Haken rechts oben kleben haben.
Also: bevor Du einen "Crashkurs Shell-Skripting" bei irgendeiner PC-Blümchen-Zeitschrift mitmachst oder "Die 100 geheimsten TOP-Insider-Batches" der Computerbild-Redaktion.... schau Dich lieber hier um.
ich mein "set log=C:\Software.txt" is klar.. um die Variable zu setzen.

aber wieso ist nach dem Echo ein . ?
echo. >%log%
Das ist notwendig, wenn man/frau eine Leerzeile/einen Leerstring ECHOen will.
Ohne den Punkt gäbe es einen Syntaxerror.

und wie funktioniert das mit dem For... Ich hab heut 5 Seiten dazu durchgelesen, aber das nie kapiert
Wie würde man das denn sinngemäß lesen?
Mehrmals.

"Für jedes Teil in dem Registry-Eintrag, führe die Schritte unter process query aus?"
For /f %%a in ('reg query hklm\software\microsoft\windows\currentversion\uninstall') do (call :process_query %%a)

goto :eof
"Für jedes Teil" heißt auf neudeutsch (falls Du mal in der Disse Eindruck schinden willst) "für jedes Token".
Wobei "Token" wiederum ein Bestandteil einer Zeile ist.
--> Batch oder auch CMD.exe arbeitet immer ZEILENweise, nie ZEICHENweise.
Und die uns von den Redmondern unerwartet vor knapp 10 Jahren erst gewährte Möglichkeit, so eine ZEILE noch in kleinere Häppchen, in TOKEN zu zerlegen, genau das war der Punkt, an dem die meisten DOS-Programmierer gesagt haben: "Hey, diesen neumodischen Krams versteht ja kein Mensch mehr - ich schule um und werde lieber Anlageberater bei der Landesbank.."
So entstand wegen der zu schnellen M$-Token-Einführung im Jahr 1998 heute, 10 Jahre später eine der lustigsten Wirtschaftskrisen der Neuzeit.

das %1 steht doch bloß für eine Variable, die man vergeben kann oder?
Selig die, die vergeben.... denn auch Ihnen wird vergeben werden...
Wozu gibt es denn immer die vielen %
Damit die vielen, vielen kleinen Variablen auch von der Mama CMD.exe wiedergefunden werden können zwischen dem ganzen stilisierten Denglisch, das so in einer Batchzeile steht.
set KEY=%1
Weise der Variablen KEY der Wert des ersten Parameters zu, der hier in der (Unter)Funktion angekommen ist.
reg query %key% /v Displayname >>%log%
reg query %key% /v DisplayVersion >>%log%
Beim Definieren, bein SETzen der Variable war klar: Nach SET muss ein Variablenname kommen.
Hier in den Folgezeilen werden durch die %-Zeichen sozusagen der CMD.exe die "Zeilenbestandteile" gezeigt, die durch variable Inhalte ersetzt werden müssen, bevor die eigentliche Zeile ausgeführt wird.
goto :eof
Neudeutsch für "Nu' mach hinne! Werd ma' langsam fertich jezz!"

Ok sorry, falls es zu viele Anfängerfragen sind xD
Ach was.... verglichen mit dem Bahnvorstand sind wir doch alle Anfänger.

Danke sehr. Sagt mir Bescheid, wenn ich zu viel gefragt hab und lieber woanders nachlesen sollte
Das wiederum würde Dich ja beim Lesen unnötig ablenken, wenn 50000 UserInnen "Bescheid!" sagen.
Bleib lieber hier und frag weiter - dafür haben wir immer Zeit hier.
Vielen Dank im Voraus
Okay, speziell diese Phrase ist nicht so der Bringer in diesem Seitenarm des Forums.
Bitte einfach weglassen in Zukunft und statt dessen einfach rückmelden, ob die Antwort gepasst hat.

Grüße
Biber
Member: Milli2311
Milli2311 Nov 03, 2008 at 16:31:27 (UTC)
Goto Top
Hi Biber,

Danke sehr, du hast mir sehr geholfen. face-smile