connecthor
Goto Top

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):

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

Content-ID: 177799

Url: https://administrator.de/forum/differenz-von-einer-referenz-txt-per-batch-177799.html

Ausgedruckt am: 22.12.2024 um 04:12 Uhr

cse
cse 16.12.2011 um 12:49:34 Uhr
Goto Top
Hi,

auf die schnelle würde ich das mit SVERWEIS im Excel machen.

Überall da wo ein #NV steht hättest du dann die Werte die nicht vorhanden sind.

In dem Fall hier würde ich in der zweiten Liste eine Spalte rechts daneben machen --> Sverweis(A1;erste Liste;1;falsch).

Grüße!
connecthor
connecthor 16.12.2011 um 13:52:59 Uhr
Goto Top
Hi CSE,

vielen dank, aber ich ermittle die werte in eine txt, dann möchte ich die ungern in eine csv umwandlen und die se dann importieren, diese dann checken und diese dann exportieren oder so augeben das ich die dann wieder in eine txt als liste geben kann/muss.

da problem liegt eher in der vielzahl (~900) unterschiedlichen dateien die ich mit der einer referenzdatei verglichen muss.

face-confused-alt

danke

connecthor
cse
cse 16.12.2011 um 14:19:59 Uhr
Goto Top
hui,

ok 900 dateien, das ist dann schon ne hausnummer face-smile - da kann ich dir auch nicht helfen face-smile

viel erfolg
bastla
bastla 16.12.2011 um 14:31:31 Uhr
Goto Top
Hallo connecthor!

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%"  
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
pieh-ejdsch
pieh-ejdsch 19.12.2011 um 18:41:18 Uhr
Goto Top
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.
@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
bastla
bastla 19.12.2011 um 19:24:47 Uhr
Goto Top
@ph
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
pieh-ejdsch
pieh-ejdsch 20.12.2011 um 11:40:43 Uhr
Goto Top
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.
@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.
[Edit]

Gruß Phil
connecthor
connecthor 20.12.2011 um 13:15:39 Uhr
Goto Top
Hallo Bastla & Phil,

nicht das das hier in ein wildes haare-ziehen-und-beissen ausartet.

erst einmal vielen dank für eure hilfe/vorschläge.

grund meiner fragestellung ist:

firma ~900 rechner; einmal in der woche sollen von allen rechnern die md5 werte der .EXE dateien auf dem gesamten system ermittelt werden und mit denen in einer referenzdatei hinterlegten werten verglichen werden. die werde die nicht übereinstimmen sollen dann in eine z.b. RECHNERNAME-DIFF.TXT geschrieben werden.

natürlich ist das schwierig, da die wöchentlichen werte in eine verzeichniss laufen und ALLE dateien mit der referenz verglichen und die unterschiede dann auch ich jeweils eine NEUE datei geschrieben werden sollen.. face-confused

z.z. würde ich dass dann irgendwie händisch machen müssen...

bin also für vorschläge die mir die arbeit vereinfachen SEHR offen face-smile

danke
pieh-ejdsch
pieh-ejdsch 20.12.2011 um 21:00:48 Uhr
Goto Top
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
connecthor
connecthor 21.12.2011 um 08:28:01 Uhr
Goto Top
guten morgen, moin phil.

wie gaaaaanz oben beschrieben werden die werte per SIGCHECK von sysinternals ausgelesen. und ja, pro pc eine datei in einem bestimmten ordner( auf nem netzlaufwerk). von mir aus geht natürlich auch ein sortieren schon "am pc". wenn das mit dem vergleich klappt hätte ich das bestimmt irgendwann schon umgebaut.

danke und noch einen schönen tag
pieh-ejdsch
pieh-ejdsch 21.12.2011 um 16:07:18 Uhr
Goto Top
moin
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
connecthor
connecthor 22.12.2011 um 16:12:17 Uhr
Goto Top
hi phil, danke für die schnelle antwort. die daten sollen per logon-script gelesen werden. ich werde deinen vorschlag testen ... aber erst im nächsten jahr. bis dahin wünsche ich euch allen ein gesegnetes und beschehrungsreiches weihnachtsfest und einen gesunden rutsch... na ja, bei dem wetter werden wir wohl laufen müssen face-smile