Vergleich zweier Dateien Updates
Hallo ich bin neu hier und bräuchte ganz dringend Hilfe bei einem Problem. Wäre nett wenn Ihr mir helfen könntet.
Es geht um folgendes.
Ich habe zwei .txt Dateien ca. in folgendem Style:
Datei1:
Office_2012_1
Windows_XP_#18
Office_#7.1
Word_#14
usw.
Datei2:
Office_2012_3
Windows_XP_#19
Office_#7.1
Word_#15
usw.
Datei 1 ist von einem Rechner aus einem Installationslog. Es zeigt Software an welche darauf installiert ist.
Datei 2 ist von einem Server welcher die Rechner mit Updates versorgt. Die Updates auf dem Server werden automatisch hochgeladen. Dort erstelle ich mir immer eine aktuelle txt mit den im Moment aktuellen Updates.
Mein Problem ist jetzt das ich die beiden Datei vergleichen will und als Ergebnis heraus bekomme, dass wie oben in dem Beispiel zu sehen ein Update für Office ein Update für Windows und ein Update für Word verfügbar ist.
am liebsten als Batch.
Es geht um folgendes.
Ich habe zwei .txt Dateien ca. in folgendem Style:
Datei1:
Office_2012_1
Windows_XP_#18
Office_#7.1
Word_#14
usw.
Datei2:
Office_2012_3
Windows_XP_#19
Office_#7.1
Word_#15
usw.
Datei 1 ist von einem Rechner aus einem Installationslog. Es zeigt Software an welche darauf installiert ist.
Datei 2 ist von einem Server welcher die Rechner mit Updates versorgt. Die Updates auf dem Server werden automatisch hochgeladen. Dort erstelle ich mir immer eine aktuelle txt mit den im Moment aktuellen Updates.
Mein Problem ist jetzt das ich die beiden Datei vergleichen will und als Ergebnis heraus bekomme, dass wie oben in dem Beispiel zu sehen ein Update für Office ein Update für Windows und ein Update für Word verfügbar ist.
am liebsten als Batch.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 189855
Url: https://administrator.de/forum/vergleich-zweier-dateien-updates-189855.html
Ausgedruckt am: 09.04.2025 um 03:04 Uhr
18 Kommentare
Neuester Kommentar
Hallo Ozzestriker!
Anyhow, wenn die Einträge einheitlich ein "#" vor der Versionsnummer hätten, ginge das etwa so:
Grüße
bastla
Installiere das Paket xyz weil es neuer ist als die bestehende Version
Ist denn davon auszugehen, dass es am Server (in der Datei2) auch ältere Versionen gibt? @echo off & setlocal
set "Aktuell=Datei"
set "Update=Datei2"
for /f "usebackq tokens=1* delims=#" %%i in ("%Aktuell%") do (
for /f "tokens=1* delims=#" %%a in ('findstr /b "%%i" "%Update%"') do if %%b gtr %%j echo Installiere das Paket %%i#%%j weil es neuer ist als die bestehende Version
)
bastla
Hallo Ozzestriker!
Und die "Rechner.txt" hat allen Ernstes eine unterschiedliche Anzahl von Leerzeichen am Zeilenanfang und "_" in der Versionsnummer, die es so in der "Update Server.txt" nicht gibt? Falls ja, wäre der erste sinnvolle Schritt, das (in der "Update Server.txt") anzugleichen ...
Und: Wenn sich schon nicht ein eindeutiges Trennzeichen zwischen Programmname und Versionsnummer einführen lassen sollte, müsste zumindest sicher gestellt sein, dass alles nach dem letzten "_" die Versionsnummer darstellt ...
Grüße
bastla
Und die "Rechner.txt" hat allen Ernstes eine unterschiedliche Anzahl von Leerzeichen am Zeilenanfang und "_" in der Versionsnummer, die es so in der "Update Server.txt" nicht gibt? Falls ja, wäre der erste sinnvolle Schritt, das (in der "Update Server.txt") anzugleichen ...
Und: Wenn sich schon nicht ein eindeutiges Trennzeichen zwischen Programmname und Versionsnummer einführen lassen sollte, müsste zumindest sicher gestellt sein, dass alles nach dem letzten "_" die Versionsnummer darstellt ...
Grüße
bastla
Hallo Ozzestriker!
... abgesehen davon bleibt noch die Frage nach der Trennung der Versionsnummer vom Namen offen, bzw auch die Überlegung, zumindest auch in der "Update Server.txt" anstelle des "." einen "_" zu verwenden ...
Für diese "Rechner.txt"
und diese "Update Server.txt"
ließe sich, unter der Voraussetzung, dass alle Versionsnummern zweistellig sind, mit diesem Batch
Dein gewünschtes Ergebnis erzeugen ...
Grüße
bastla
Habs oben auch abgeändert.
Hast Du nicht - es gibt ab Zeile 2 der "Rechner.txt" am Zeilenanfang immer noch jeweils ein Leerzeichen (und am Zeilenende sogar mehrere) ...... abgesehen davon bleibt noch die Frage nach der Trennung der Versionsnummer vom Namen offen, bzw auch die Überlegung, zumindest auch in der "Update Server.txt" anstelle des "." einen "_" zu verwenden ...
Für diese "Rechner.txt"
ITBETRIEB_32_9_1_1_C
JRE_32_9_1
JRE_8_1
JRE_9_0
JRE_96_11_0
JRE_VOR_32_9_1
JRE_VOR_96_11_0
JRE_64_9_2
JRE_96_11_2
JRE_96_11_3
JRE_96_12_0
JRE_VOR_96_11_2
JRE_VOR_96_11_3
JRE_VOR_96_12_0
@echo off & setlocal
set "Aktuell=Rechner.txt"
set "Update=Update Server.txt"
set "Liste=ErforderlicheUpdates.txt"
type nul>"%Liste%"
for /f "usebackq skip=1 delims=" %%i in ("%Aktuell%") do set "EintragA=%%i" & call :ProcessEntry
type "%Liste%"
goto :eof
:ProcessEntry
pushd C:\
for %%a in (%EintragA:_=\%\..) do set "Name=%%~dpa" & set "VA=%%~nxa"
set "Name=%Name:C:\=%"
popd
set "Name=%Name:\=_%"
set "EintragU="
for /f "delims=" %%a in ('findstr /bic:"%Name%" "%Update%"') do set "EintragU=%%a"
if not defined EintragU goto :eof
call set "VU=%%EintragU:*%Name%=%%"
if %VU% gtr %VA% findstr "%EintragU%" "%Liste%">nul || >>"%Liste%" echo %EintragU%
goto :eof
Grüße
bastla
Moin Ossistreichler,
Wenn überhaupt jemand die Aufgabe umsetzt ohne laut zu werden, dann er.
Ich dagegen hätte schon mehrfach geschrieen und Flüche in Klingonisch ausgestossen.
Lass mich vorsichtig und leise nachfragen:
WTF erzwingt diese merkwürdige Rahmenbedingung, das zwei Listen miteinander verglichen werden sollen, die nur um drei Ecken herum miteinander verwandt sind?
Warum nicht erstmal eine Einigung auf EIN Format für BEIDE Textdateien??
Grüße
Biber
Zitat von @Ozzestriker:
Hi Bastla,
ich wusste das ich hier im richtigen Forum bin und du der Richtige für dieses Problem.
Ich sach ma' so: bastla ist nach meinem Eindruck einer der geduldigsten und leidensfähigsten Entwicklungshelfer dieser Galaxie.Hi Bastla,
ich wusste das ich hier im richtigen Forum bin und du der Richtige für dieses Problem.
Wenn überhaupt jemand die Aufgabe umsetzt ohne laut zu werden, dann er.
Ich dagegen hätte schon mehrfach geschrieen und Flüche in Klingonisch ausgestossen.
Lass mich vorsichtig und leise nachfragen:
WTF erzwingt diese merkwürdige Rahmenbedingung, das zwei Listen miteinander verglichen werden sollen, die nur um drei Ecken herum miteinander verwandt sind?
Warum nicht erstmal eine Einigung auf EIN Format für BEIDE Textdateien??
Grüße
Biber
@Biber
)
@Ozzestriker
Wie schon oben angesprochen: So macht das nicht wirklich Sinn - wenn es keine Struktur (und das noch nicht einmal innerhalb einer der Dateien) gibt, die ein sicheres Aufteilen in Name und Version ermöglicht, und dann auch noch nicht mal die Schreibweise der Versionsnummern zwischen den Dateien vergleichbar ist, wird das nix ...
Grüße
bastla
Flüche in Klingonisch
... hätte ich vielleicht auch schon erwogen (aber geschrieben machen die nicht ganz so viel her @Ozzestriker
Wie schon oben angesprochen: So macht das nicht wirklich Sinn - wenn es keine Struktur (und das noch nicht einmal innerhalb einer der Dateien) gibt, die ein sicheres Aufteilen in Name und Version ermöglicht, und dann auch noch nicht mal die Schreibweise der Versionsnummern zwischen den Dateien vergleichbar ist, wird das nix ...
Grüße
bastla
Moin Ostseestreiker,
Ja sorry, aber du hast deine Frage doch im Bereich "Entwicklung" gepostet.
Und bei Aufgabenstellungen in diesem Bereich gehört auch dazu, gegebenfalls die "Vorgaben" anzupassen.
Ich habe das schon mehrfach an anderen Stellen geschrieben, wie das Herangehen an solche "Projekte" ist.
- Definieren, was das Ziel ist
- Ermitteln, was ich dafür brauche
- Ermitteln, was ich davon schon habe
- Eskalieren, wenn mir mir etwas Entscheidendes fehlt
--> Wenn das Ziel mit den gegebenen Rahmenbedingungen nicht erreichbar ist, dann brauche ich nicht anzufangen.
Wenn du deinem Cheffe gegenüber begründen kannst, warum eine automatisierte Verarbeitung unter diesen Umständen nicht sinnvoll möglich ist, dann ist auch das durchaus ein Grund dafür, warum er dich für diesen Job eingestellt hat.
Grüße
Biber
Zitat von @Ozzestriker:
Hi,
ok ok ich gibs ja zu das klingt alles plausibel.
Aber was soll ich machen ich hab mir die Txt's nicht ausgesucht sind Vorgaben.
Hi,
ok ok ich gibs ja zu das klingt alles plausibel.
Aber was soll ich machen ich hab mir die Txt's nicht ausgesucht sind Vorgaben.
Ja sorry, aber du hast deine Frage doch im Bereich "Entwicklung" gepostet.
Und bei Aufgabenstellungen in diesem Bereich gehört auch dazu, gegebenfalls die "Vorgaben" anzupassen.
Ich habe das schon mehrfach an anderen Stellen geschrieben, wie das Herangehen an solche "Projekte" ist.
- Definieren, was das Ziel ist
- Ermitteln, was ich dafür brauche
- Ermitteln, was ich davon schon habe
- Eskalieren, wenn mir mir etwas Entscheidendes fehlt
--> Wenn das Ziel mit den gegebenen Rahmenbedingungen nicht erreichbar ist, dann brauche ich nicht anzufangen.
Wenn du deinem Cheffe gegenüber begründen kannst, warum eine automatisierte Verarbeitung unter diesen Umständen nicht sinnvoll möglich ist, dann ist auch das durchaus ein Grund dafür, warum er dich für diesen Job eingestellt hat.
Grüße
Biber
Hallo Ozzestriker!
Verständlich ist es, aber mit dem aktuellen (unterschiedlichen) Format der beiden Dateien so nicht umsetzbar - denn wenn es nur darum ginge, alle Einträge Deiner Liste zu finden, die nicht in der "Installlog.txt" stehen, wären wir wieder bei der einen Zeile ganz oben ...
Da Du ja aber auch Updates auf die nächsthöhere Versionsnummer berücksichtigen willst, steht und fällt das mit der Zerlegbarkeit bzw Vergleichbarkeit der Einträge in den beiden Dateien (eine übrigens nicht ganz neue Erkenntnis
) ...
Grüße
bastla
Verständlich ist es, aber mit dem aktuellen (unterschiedlichen) Format der beiden Dateien so nicht umsetzbar - denn wenn es nur darum ginge, alle Einträge Deiner Liste zu finden, die nicht in der "Installlog.txt" stehen, wären wir wieder bei der einen Zeile ganz oben ...
Da Du ja aber auch Updates auf die nächsthöhere Versionsnummer berücksichtigen willst, steht und fällt das mit der Zerlegbarkeit bzw Vergleichbarkeit der Einträge in den beiden Dateien (eine übrigens nicht ganz neue Erkenntnis
Grüße
bastla
moin,
wenn die Versionsnummern schon bei dem Unterschiedlich aufgebauten Formatierungen innerhalb eines Programmes sind, wird es mit der Sortierung nicht einfach werden.
da scheitert auch ein
Eine Sortierung der Dateien nach Datum ist da sinnvoller, wenn alle Versionen Benötigt werden. Da kann dann auch die Liste Zeile für Zeile durchsucht werden.
Bei Gleichmässiger Formatierung (12.0.1 11.1.0 09.2.1) wäre die Sortierung der Updates wenigstens nach Software auch richtig.
Für was werden denn all diese "Vorher" Updates benötigt?
Im Grunde reicht es doch das aktuellste Update je Programm in dem Log zu haben.
Fürs checken ob ein Update schon Durchgeführt worden ist könnte es helfen.
Da die Punkte in der Update.txt beim Findstr als ein beliebiges Zeichen gefunden werden, könnte die Positivliste so ausgelesen werden:
[Edit]Zeile Umgetauscht...und etwas verbessert[/Edit]
[Edit2] findstr angepasst[/Edit2]
Gruß Phil
wenn die Versionsnummern schon bei dem Unterschiedlich aufgebauten Formatierungen innerhalb eines Programmes sind, wird es mit der Sortierung nicht einfach werden.
W-SYSInstall_96_11.1
W-SYSInstall_96_12.0
W-SYSInstall_96_9.2.1
if 12.0 gtr 9.2.1 echo 12.0 ist neuer
... oder
if 12.0 gtr 9.2 echo 12.0 ist neuer
Bei Gleichmässiger Formatierung (12.0.1 11.1.0 09.2.1) wäre die Sortierung der Updates wenigstens nach Software auch richtig.
Für was werden denn all diese "Vorher" Updates benötigt?
Im Grunde reicht es doch das aktuellste Update je Programm in dem Log zu haben.
Fürs checken ob ein Update schon Durchgeführt worden ist könnte es helfen.
Da die Punkte in der Update.txt beim Findstr als ein beliebiges Zeichen gefunden werden, könnte die Positivliste so ausgelesen werden:
@echo off
setlocal enabledelayedexpansion
set "UList=Updates.txt"
set "RList=Rechner.txt"
for /f "usebackqtokens=1-15delims=_" %%a in ("%UList%") do (
set "Program="
set "Version="
for %%A in (%%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%k %%l %%m %%n) do (
if defined Version set "Program=!Program!!Version!_"
set "Version=%%A"
)
rem Ausgabe von möglichen Updates ...
findstr /i "!Program!" "%RList%" |findstr /iv "!Version!" >nul &&echo !Program!!Version!
)
pause
[Edit]Zeile Umgetauscht...und etwas verbessert[/Edit]
[Edit2] findstr angepasst[/Edit2]
Gruß Phil