ralus67
Goto Top

Datei mit bestimmter Grösse leeren

Hallo Community

Ich habe mir eine Batch erstellt, welche eine Datei nach einer gewisssen Grösse löschen soll. Irgendwie sehe ich da nicht durch.

Die Batch Datei sieht folgendermassen aus:
@echo off

set datei=catalina_rl.out
set logpath=C:\NetIQ\idm\apps\tomcat\logs\
set logsizemax=11846613497
:: Wert in Bytes: 10000000 = 10 Mb
for /f "tokens=1-3" %%i in ('dir "%logpath%%datei%" /-C /S ^|find "File(s)" ^|find "bytes"') do set logsize=%%k  

if %logsize% LEQ %logsizemax% (
echo "Dateigroesse der %Datei% nicht erreicht"  
) ELSE (
echo >C:\NetIQ\idm\apps\tomcat\logs\%datei%
)

Wenn ich im cmd "set" eingebe sehe ich folgende Variablen
logsize=11846613498
logsizemax=11846613497

also müsse doch, falls die logsize kleiner gleich ist den Wert der Maximalgrösse müsste hier die Datei gelöscht werden

Leider funktioniert diese Abfrage nicht.

Kann mir jemand mit diesem Problem weiterhelfen?

Content-Key: 617990

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

Ausgedruckt am: 28.03.2024 um 14:03 Uhr

Mitglied: cykes
cykes 31.10.2020 aktualisiert um 12:11:56 Uhr
Goto Top
Hi,
Wenn ich im cmd "set" eingebe sehe ich folgende Variablen
logsize=11846613498
logsizemax=11846613497

also müsse doch, falls die logsize kleiner gleich ist den Wert der Maximalgrösse müsste hier die Datei gelöscht werden

Leider funktioniert diese Abfrage nicht.

Kein Wunder, denn (mit den obigen Werten) gilt: logsize = logiszemax + 1 => logsize > logsizemax
Entweder umschreiben (bspw. if %logsizemax% LEQ %logsize% [...]) oder logsizemax auf bspw. 11846613499 setzen.

Kannst natürlich auch mal in der Anwendung schauene, ob nicht ein logrotate o.ä. möglich ist.

Gruß

cykes
Mitglied: rubberman
rubberman 31.10.2020 aktualisiert um 12:35:08 Uhr
Goto Top
Ergänzend:
Ja, Batch kann auch numerisch vergleichen. Aber nur innerhalb dessen, was die CMD als numerischen Wert erkennt. Und das ist eine 32 Bit breite vorzeichenbehaftete Ganzzahl. Anders gesagt, die größte Zahl die die CMD kennt ist 2147483647.
@echo off &setlocal
if 11846613498 gtr 11846613497 (echo erste Zahl ist groesser.) else echo nope
if 1846613498 gtr 1846613497 (echo erste Zahl ist groesser.) else echo nope
pause
Im zweiten Vergleich ist jeweils die führende 1 abgeschnitten um in den 32 Bit Bereich zu kommen. Ergebnis:
nope
erste Zahl ist groesser.
Drücken Sie eine beliebige Taste . . .
Steffen
Mitglied: Ralus67
Ralus67 31.10.2020 um 12:36:19 Uhr
Goto Top
Hallo Cykes

mit logsizemax 11846613499 setzen, wüde die Bendingung sowieso nich funktionieren

Wenn die Datei (logsize)11846613498 hat und die logsizemax auf 11846613497 ist müsste doch die datei doch gelöscht werden

if %logsize% LEQ %logsizemax% (
echo "Dateigroesse der %Datei% nicht erreicht"
) ELSE (
echo >C:\NetIQ\idm\apps\tomcat\logs\%datei%
)

Wenn 11846613498 kleiner gleich ist 11846613497 soll das Echo Dateigrösse nicht errreicht ausgeführt werden.
jedoch wird hier der Wert überschritten. Das heisst, logsize ist grösser als logzisemax

Also müsste hier doch echo >C:\Neitq..... greifen, aber genau das funktioniert nicht.

Eventuell mache ich hier einfach ein Überlegungsfehler.

aber ich probier mal deinen Lösungsweg


Gruss Ralus67
Mitglied: rubberman
rubberman 31.10.2020 um 12:48:15 Uhr
Goto Top
Siehe meinen Kommentar oben face-wink
Mitglied: Ralus67
Ralus67 31.10.2020 um 12:57:32 Uhr
Goto Top
Hallo Steffen

Wenn ich dich richtig verstehe, ist der Wert 11 GB bzw. 11846613498 bytes für die cmd zu gross?
Mitglied: rubberman
rubberman 31.10.2020 aktualisiert um 13:08:22 Uhr
Goto Top
Ja, zu groß um numerisch verglichen zu werden. Wenn du bei Batch bleiben willst/musst, dann geht das nur über einen gezielten Workaround per String. Dazu musst du aber sicherstellen, dass die Stringlängen immer gleich sind, ansonsten wäre "2" größer als "10" da das Zeichen 2 größer als das Zeichen 1 ist.
Ungetestet:

@echo off &setlocal

set "datei=catalina_rl.out"  
set "logpath=C:\NetIQ\idm\apps\tomcat\logs\"  
set "logsizemax=00000000011846613497"  
set "zeros=00000000000000000000"  

for %%i in ("%logpath%%datei%") do set "logsize=%zeros%%%~zi"  
set "logsize=%logsize:~-20%"  

if "%logsize%" LEQ "%logsizemax%" (  
  echo "Dateigroesse der %Datei% nicht erreicht"  
) ELSE (
  >"%logpath%%datei%" type nul  
)
Steffen