Hallo zusammen,
da dies mein erster Post in diesem Forum ist, hoffe ich, dass ich nicht allzu viel falsch mache und die User verärgere.
Folgendes Problem habe ich:
Meine Kenntnisse der Batch-Programmierung sind eher rudimentär und werden gerade aufgebaut. Da ich bei meinem Arbeitgeber derzeit in einer Art Ausbildungsphase bin und hier auch Batch gelehrt wird (neben anderen Programmiersprachen), habe ich vor kurzem einige (leichte) Aufgaben gestellt bekommen, die einfach dazu dienen sollen, die Syntax und Programmierweise zu erlernen.
Eine Aufgabe war folgende:
Aufgabe 3: Erzeugen einer Logdatei an einem Ort, welcher in der Registry gespeicher ist
1. Der Speicherort soll an folgender Stelle definiert werden: Schlüssel: HKLM\Software\Firmenname, Wert: LogFilePath
2. Der Inhalt der Logdatei ist beliebig
3. Im gleichen Schlüssel soll in dem Wert "LogFileCration" festgehalten werden, ob die Erzeugung der Logdatei erfolgreich war oder nicht (1|0)
Ich habe diese Aufgabe ein wenig geskriptet und kam schnell zum "richtigen" Ergebnis, allerdings fiel mir auf, dass es keine Fehlersicherheit gab. Sprich, wenn nicht in die Log-Datei geschrieben wird, diese aber dennoch besteht, dann wird der LogFileCreation-Key nicht auf "0" gesetzt. Was ich meine wird bestimmt deutlich, wenn man sich den Code betrachtet. Diese Lücke wurde von mir mittels Vergleich der Zeilenanzahl in der Log-Datei und einer Vergleichs-Datei (copy von Log) geschlossen, wobei dann folgendes, für mich leider unlösbares Problem auftrat. Sobald die neu geschriebene Datei von 9 auf 10 Zeilen springt (die Vergleichsdatei bleibt hierbei auf 9), kann kein anständiger Vergleich mehr stattfinden. Selbiges geschieht beim Sprung von 99 auf 100 usw.
Hat irgendjemand eine Idee, wie sich dieses Problem lösen lässt? Da ich noch Anfänger bin, würde ich ungern mein Skript komplett umcoden, da dies sicherlich unglaubwürdig wäre, aber dennoch würde ich das Problem gerne irgendwie lösen!
Hier der Code:
@echo off
setlocal
::Variablen definieren
set logfile=log.log
set registry=HKLM\Software\sepago
set key=LogFilePath
set crea=LogFileCreation
set filepath=C:\Windows\System32\LogFiles\RegistryTest\
set vergleich=C:\Windows\System32\LogFiles\RegistryTest\Vergleich\
set /a "counter=0"
set /a "counter2=0"
::Hauptroutine
call :Renew
call :Create
call :Check
call :Find
call :Write
call :Count
call :Writecheck
goto FIN
::Logfile-Creation Key Löschung
:Renew
reg query %registry% /v %crea% 2>nul
if %errorlevel% EQU 0 (reg delete %registry% /v %crea% /f) else goto :eof
goto :eof
::Vergleichsdater erstellen
:Create
if Not Exist %vergleich%%logfile% (echo. >> %vergleich%%logfile%) else goto :eof
goto :eof
::Check des Registry-Eintrags
:Check
reg query %registry% /v %key% 2>nul
if %errorlevel% NEQ 0 (reg add %registry% /v %key% /d %filepath% /f) else goto :eof
goto :eof
::Finden des Pfades
:Find
for /f "tokens=3" %%i in ('reg query %registry% /v %key%') do set location=%%i
goto :eof
::Ausgabe in der Logdatei
:Write
echo %date% %time% Test der LogFile-RegistryPfad-Aufgabe. >> %location%%logfile%
goto :eof
::Zählen der Zeilen der Logdatei und der Vergleichslogdatei
:Count
FOR /F %%A IN (%location%%logfile%) DO SET /A "Counter+=1"
echo %Counter% Zeilen
FOR /F %%B IN (%vergleich%%logfile%) DO SET /A "Counter2+=1"
echo %Counter2% Zeilen
goto :eof
::Schreiben in den Logfile-Creation Key
:Writecheck
if "%Counter%" GTR "%Counter2%" (
copy %location%%logfile% %vergleich%%logfile%
reg add %registry% /v %crea% /d 1 >nul
) else (
echo Die Logdatei wurde nicht fortgeschrieben. Bitte vergleichen Sie Log-Datei und Vergleichsdatei selbstaendig.
reg add %registry% /v %crea% /d 0 >nul
)
goto :eof
:FIN
endlocal
Sollte die Zeilenanzahl Log-File < Zeilenanzahl Vergleichsfile sein, wird mit jeder Skriptausführung der Log-File eine Zeile hinzugefügt, so dass sich die Zeilenanzahlen wieder annähern, was letztendlich ein falsches Ergebnis liefern wird, aber diesem Problem würde ich mich erst nach der Lösung des 10/100/1000-Problems annehmen.
Vielen Dank vorab für jedwede Hilfe und schöne Grüße,
Richie