Differenz von einer referenz txt per batch
guten tag an alle;
weiterführend zu meinem letzten Beitrag Txt zeilenweise per batch sortieren hätte ich nun eine frage wie ich es hinbekomme, die Ausgabedatei mit einer erstellten Referenzdatei zu vergleichen und den unterschied, falls vorhanden, in eine separate txt auszugeben.
FC hilft dabei nach meinen versuchen nicht, da immer die differenz aus beiden dateien geschrieben wird.
Referenzdatei wie folgt (z.b):
zu prüfende datei z.b. wie folgt:
ich möchte die 2 einträge aus der vergleichsdatei in eine datei ausgeben, aber nur die werte, die nicht in der vergleichsdatei stehen.
danke
weiterführend zu meinem letzten Beitrag Txt zeilenweise per batch sortieren hätte ich nun eine frage wie ich es hinbekomme, die Ausgabedatei mit einer erstellten Referenzdatei zu vergleichen und den unterschied, falls vorhanden, in eine separate txt auszugeben.
FC hilft dabei nach meinen versuchen nicht, da immer die differenz aus beiden dateien geschrieben wird.
Referenzdatei wie folgt (z.b):
c:\windows\certutil.exe: MD5: 711db2ef10b6c2ab2080698aec6c6d08
c:\windows\explorer.exe: MD5: 418045a93cd87a352098ab7dabe1b53e
c:\windows\hh.exe: MD5: 4ba83377214a999fbc9511604a924f9e
c:\windows\NOTEPAD.EXE: MD5: 8a29b5b5a881c6709f31ff5203f0fac9
c:\windows\regedit.exe: MD5: ad9226bf3ced13636083bb9c76e9d2a2
c:\windows\robocopy.exe: MD5: 592be1ad0ed83c36d5e68ca7a014a510
c:\windows\TASKMAN.EXE: MD5: 3a0c664583a0ba6c34fab808e9021798
zu prüfende datei z.b. wie folgt:
c:\windows\certutil.exe: MD5: 711db2ef10b6c2ab2080698aec6c6d08
c:\windows\twunk_16.exe: MD5: f36a271706edd23c94956afb56981184
c:\windows\explorer.exe: MD5: 418045a93cd87a352098ab7dabe1b53e
c:\windows\hh.exe: MD5: 4ba83377214a999fbc9511604a924f9e
c:\windows\NOTEPAD.EXE: MD5: 8a29b5b5a881c6709f31ff5203f0fac9
c:\windows\regedit.exe: MD5: ad9226bf3ced13636083bb9c76e9d2a2
c:\windows\robocopy.exe: MD5: 592be1ad0ed83c36d5e68ca7a014a510
c:\windows\xcacls.exe: MD5: 64e4a4603752801be14dc6647dd6b167
c:\windows\TASKMAN.EXE: MD5: 3a0c664583a0ba6c34fab808e9021798
ich möchte die 2 einträge aus der vergleichsdatei in eine datei ausgeben, aber nur die werte, die nicht in der vergleichsdatei stehen.
danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 177799
Url: https://administrator.de/contentid/177799
Ausgedruckt am: 19.11.2024 um 15:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo connecthor!
Versuch es (zunächst für eine Datei) so:
Soll für die 900 Dateien eine Gesamtdatei mit den Abweichungen oder jeweils eine eigene Differenzdatei erstellt werden, und welche Information(en) soll(en) enthalten sein?
Außerdem: Wenn es nur um MD5-Hashes gehen sollte, könnte vielleicht "fciv" oder ein anderes Commandline-MD5-Tool die bessere Wahl sein ...
Grüße
bastla
Versuch es (zunächst für eine Datei) so:
@echo off & setlocal
set "Ref=referenz.txt"
set "Test=test.txt"
set "Diff=diff.txt"
del "%Diff%" 2>nul
set "Header=### Nicht wie in Referenz:"
for /f "usebackq delims=" %%i in ("%Test%") do findstr /x /c:"%%i" "%Ref%">nul || (
if defined Header echo %Header%
set "Header="
echo %%i
)>>"%Diff%"
set "Header=### Fehlend:"
for /f "usebackq" %%i in ("%Ref%") do findstr /b /c:"%%i" "%Test%">nul || (
if defined Header echo %Header%
set "Header="
echo %%i
)>>"%Diff%"
Außerdem: Wenn es nur um MD5-Hashes gehen sollte, könnte vielleicht "fciv" oder ein anderes Commandline-MD5-Tool die bessere Wahl sein ...
Grüße
bastla
moin,
@bastla
sollte es nicht genügen den Ausdruck mit Findstr rauszufiltern?
Das einzige was in die zu Durchsuchende Datei muss ist ein abschliessender Linefeed.
Gruß Phil
@bastla
sollte es nicht genügen den Ausdruck mit Findstr rauszufiltern?
Das einzige was in die zu Durchsuchende Datei muss ist ein abschliessender Linefeed.
@echo off &setlocal
set "Ref=D:\testa"
set "Test=D:\testb"
set "Diff=D:\diff"
:: nur Fehlenden LineFeed setzen
for /f %%i in ('findstr /n "^" "%Test%"^|find /c ":"') do for /f %%j in ('^(findstr /n "^" "%Test%"^&echo :^)^|find /c ":"') do if %%i == %%j (set "LineFeed=") else set "LineFeed=>nul"
>>"%Test%" %LineFeed% echo(
>"%Diff%" findstr /v /l /g:"%Ref%" "%Test%"
Gruß Phil
@ph
Abgesehen davon ist aber weiterhin die Frage offen, was als Ergebnis gewünscht wird (nicht zuletzt auch hinsichtlich jener Zeilen der Referenzdatei, zu denen es in der Testdatei keine Entsprechung gibt) ...
Grüße
bastla
sollte es nicht genügen den Ausdruck mit Findstr rauszufiltern?
Grundsätzlich ja - allerdings brauchst Dein Ansatz zwei verschachtelte Schleifen ...Abgesehen davon ist aber weiterhin die Frage offen, was als Ergebnis gewünscht wird (nicht zuletzt auch hinsichtlich jener Zeilen der Referenzdatei, zu denen es in der Testdatei keine Entsprechung gibt) ...
Grüße
bastla
moin bastla,
ja eigentlich wollte ich nur mit den zwei Schleifchen auf den Fehlenden Linefeed testen.
more fügt zwar auch einen fehlenden LF an die Ausgabe - aber leider entfernt er auch alle Tabs. Somit stimmt die OriginalZeile nicht mehr mit der Überprüfenden Zeile überein.
Bleibt nur noch find/v "" <datei um den fehlenden LF ohne große Umwege zu erzeugen.
[Edit]
Ach Käse. Die Befehlverkettung fügt auch bei type und findstr usw. also immer einen LineFeed an.
schäm ...
Aber eine Einfacherere Art um auf LF am Ende zu Testen habe ich dafür gefunden.
[Edit]
Gruß Phil
ja eigentlich wollte ich nur mit den zwei Schleifchen auf den Fehlenden Linefeed testen.
more fügt zwar auch einen fehlenden LF an die Ausgabe - aber leider entfernt er auch alle Tabs. Somit stimmt die OriginalZeile nicht mehr mit der Überprüfenden Zeile überein.
Bleibt nur noch find/v "" <datei um den fehlenden LF ohne große Umwege zu erzeugen.
@echo off &setlocal
set "Ref=D:\testa"
set "Test=D:\testb"
set "Diff=D:\diff"
find /v "" < "%Test%" |findstr /v /l /g:"%Ref%" >"%Diff%"
[Edit]
Ach Käse. Die Befehlverkettung fügt auch bei type und findstr usw. also immer einen LineFeed an.
schäm ...
Aber eine Einfacherere Art um auf LF am Ende zu Testen habe ich dafür gefunden.
findstr /v /l /g:Datei Datei 1>nul && echo KEIN LF am Ende.||echo LF ist am Ende.
Gruß Phil
Hallo connecthor,
wenn die Diffs wieder in den Selben Ornder sollen könnten ja auch gleich die wöchentlichen Vergleichsdateien gelöscht werden.
Gibt es da Pro Rechnername eine Referenzdatei (Rechnername-Ref.txt)? Im selben/anderen Verzeichnis?
Wie holst Du denn die Vergleichsdaten von den Maschinen ab? Vllt kann in diesem Prozedere gleich der Diifferenzialwert ausgegeben in eine *-diff.txt erstellt werden.
Gruß Phil
wenn die Diffs wieder in den Selben Ornder sollen könnten ja auch gleich die wöchentlichen Vergleichsdateien gelöscht werden.
Gibt es da Pro Rechnername eine Referenzdatei (Rechnername-Ref.txt)? Im selben/anderen Verzeichnis?
Wie holst Du denn die Vergleichsdaten von den Maschinen ab? Vllt kann in diesem Prozedere gleich der Diifferenzialwert ausgegeben in eine *-diff.txt erstellt werden.
Gruß Phil
moin
Ich meinte mit Wie ... - ob auf den Rechnern ausgeführt oder Zentral und Deine sigcheck Zeile
hier ist es pro Maschine
Gruß Phil
Ich meinte mit Wie ... - ob auf den Rechnern ausgeführt oder Zentral und Deine sigcheck Zeile
hier ist es pro Maschine
@echo off &setlocal
set "RefFile=X:\Sigchecks\%Computername%-RefF.txt"
set "DifFile=X:\Sigchecks\%computername%-Diff.txt"
set "l="
> "%DifFile%" cmd /von /c"(for /f "delims=" %%i in (' sigcheck.exe /h /q "%windir%\*.exe" ^|findstr "\ 5:" ') do @if not defined l (set "l=1"& <nul set/p="%%i ") else (set "l=" & echo %%i))" |findstr /v /l /g:"%RefFile%"
Gruß Phil