letzify
Goto Top

Verzeichnisvergleich funktioniert, Laufzeit aber viel zu lang!

Hallo Leute,

ich hatte von meinem Chef die Aufgabe bekommen eine Batch zu programmieren, die eine Verzeichnisstruktur inklusive Dateien auf Unterschiede prüft und diese Unterschiede in einer Log-Datei festhält. Das ganze ist unter Windows 7 entstanden mit Hilfe von Linux-Bashbefehlen wie egrep und rm. Also bitte nicht wundern, wenn diese Befehle auftauchen.

Ich bin absolut kein Batch-Profi, ehrlich gesagt habe ich mit dieser Aufgabe gerade erst begonnen mich mit Batch zu befassen. Der Quellcode, den ich generiert habe funktioniert, ist aber meines Erachtens nach zu redundant und ineffektiv. Allerdings weiß ich nicht, wie ich das soweit komprimieren kann, dass auch ein Zeitvorteil dabei rausspringt.

Eckdaten:
- Laufzeit: knapp 4 Stunden
- Prüfung: 20.000 Verzeichnisse und 26.000 Dateien

Könnt ihr mir vielleicht einen Tipp geben, wie ich Redundanz vermeide?

Vielen Dank im Voraus...

@ECHO OFF & setlocal enabledelayedexpansion

echo Startzeit: %TIME% >> laufzeit.txt
cls

Path %Path%;.\bin

if not exist .\_archiv (
   md _archiv
   )

if not exist .\_logs (
   md _logs
   )

del .\_archiv\alt.txt 2>nul
ren .\_archiv\neu.txt alt.txt  2>nul

dir /S \\Server\Verzeichnis > .\_archiv\logn.txt
for /f "tokens=*" %%I in (.\_archiv\logn.txt) do (  

set string=%%I
echo "!string!" | findstr /C:"Verzeichnis von" >nul  

if not ERRORLEVEL 1 (
  set di=%%I
  set "di=!di:Verzeichnis von \\Server=!"  
  ) else (
     echo !di! %%I >> .\_archiv\logg.txt
      )
  )

egrep -w "[0-3][0-9].[0-1][0-9]" .\_archiv\logg.txt >> .\_archiv\neu.txt  

rm .\_archiv\logg.txt
rm .\_archiv\logn.txt

echo ==================================================== >> .\_logs\log.txt
echo Datum der Ueberpruefung: %DATE% , %TIME% >> .\_logs\log.txt
echo ==================================================== >> .\_logs\log.txt

echo. >> .\_logs\log.txt
for /f "tokens=*" %%J in (.\_archiv\neu.txt) do (  
 find "%%J" .\_archiv\alt.txt > nul 2>&1  
  if ERRORLEVEL 1 echo %%J >> .\_logs\log.txt
)
echo. >> .\_logs\log.txt
echo. >> .\_logs\log.txt

echo Endzeit: %TIME% >> laufzeit.txt
pause

Content-ID: 264740

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

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

Dani
Dani 27.02.2015 aktualisiert um 09:14:35 Uhr
Goto Top
Moin,
ich würde es statt mit Batch mit Powershell versuchen:
$strFolderA = Get-ChildItem -Path "C:\Temp\a\*.*" -Recurse  
$strFolderB = Get-ChildItem -Path "C:\Temp\b\*.*" -Recurse  

Compare-Object –ReferenceObject $strFolderA –DifferenceObject $strFolderB -Property LastWriteTime, FullName | Out-File C:\Temp\compare.txt
Aus der Hüfte, leider keine Zeit für Tests.

Knapp 4 Stunden.
Gut, das hängt von der Hardware ab.


Gruß,
Dani
Letzify
Letzify 27.02.2015 um 09:30:06 Uhr
Goto Top
Gut, der Arbeitslaptop ist wirklich etwas schwach auf der Brust. Mit 2GB Arbeitsspeicher und einem Core-2-Duo P8700 gehört er sicher nicht zu der Elite :D

Ich habe leider keine Berechtigung die Powershell aufzurufen - man muss vielleicht auch dazu sagen, dass ich Dualstudent bin und den Bereich hier nur für drei Monate unterstütze. Ist es auch ohne Powershell möglich?

Hinterher soll die Batch als Job von Windows auf einem Server ausgeführt werden.
Gentooist
Gentooist 27.02.2015 um 12:44:11 Uhr
Goto Top
Nun man kann sich natürlich so hinsetzen, wie du es gemacht hast, und das selber programmieren. Es schadet nichts und ist allemal eine gute Übung!

Allerdings gibt es diese Programmart schon lange in vielen Variationen, man muss da also nicht das Rad neu erfinden, wenn man denn nicht will. Die bekanntesten Vertreter solcher File System Monitoring Tools sind Tripwire, AIDE und Samhain, OSSEC/Splunk. Der Markt gibt da sehr viel her.
114757
114757 01.03.2015 aktualisiert um 10:02:18 Uhr
Goto Top
Moin,
ich nehm für sowas Beyond Compare, ist rasend schnell auch auf schwacher Hardware, kennt diverse Vergleichsmethoden, und lässt sich natürlich auch Scripten, inkl. customizable Reports.
Kann ich wärmstens empfehlen.

Gruß jodel32