Wenn XX freier speicher dann goto
Hallo 
ich hänge hier irgendwie an einer kleinigkeit und bekomme es nicht hin.
ich möchte das wenn 10GB oder weniger freier speicher auf C:\ ist das dann ein befehl oder goto ausgeführt wird. habe schon folgendes script:
@setlocal enableextensions enabledelayedexpansion
@echo off
for /f "tokens=3" %%a in ('dir c:\') do (
set bytesfree=%%a
)
set bytesfree=%bytesfree:,=%
endlocal && set bytesfree=%bytesfree%
rem truncating end. loses precision
set /a kb=%bytesfree:~0,-3%
set /a mb = kb/1024
set /a gb = mb/1024
set /a benoetigt = 10
echo %gb%
if %gb% gtr %benoetigt% goto 2
pause
:2
ECHO jetzt sind nur noch 10GB speicher frei
pause
exit
aber wenn ich zum testen %benoetigt% bewusst auf den wert ändere das %gb% kleiner ist (z.B. if 20 gtr 100 goto 2) dann geht er trotzdem zu 2!
habt ihr da eine lösung?
ich hänge hier irgendwie an einer kleinigkeit und bekomme es nicht hin.
ich möchte das wenn 10GB oder weniger freier speicher auf C:\ ist das dann ein befehl oder goto ausgeführt wird. habe schon folgendes script:
@setlocal enableextensions enabledelayedexpansion
@echo off
for /f "tokens=3" %%a in ('dir c:\') do (
set bytesfree=%%a
)
set bytesfree=%bytesfree:,=%
endlocal && set bytesfree=%bytesfree%
rem truncating end. loses precision
set /a kb=%bytesfree:~0,-3%
set /a mb = kb/1024
set /a gb = mb/1024
set /a benoetigt = 10
echo %gb%
if %gb% gtr %benoetigt% goto 2
pause
:2
ECHO jetzt sind nur noch 10GB speicher frei
pause
exit
aber wenn ich zum testen %benoetigt% bewusst auf den wert ändere das %gb% kleiner ist (z.B. if 20 gtr 100 goto 2) dann geht er trotzdem zu 2!
habt ihr da eine lösung?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 331305
Url: https://administrator.de/forum/wenn-xx-freier-speicher-dann-goto-331305.html
Ausgedruckt am: 21.02.2025 um 11:02 Uhr
4 Kommentare
Neuester Kommentar
Moin,
1. mir fällt spontan auf, dass du in deinem Code bei set /a mb = kb/1024 vergessen hast, das kb in % einzuklammern..
2. und zum Debuggen solltest du zudem immer ein @echo on, statt @echo off machen.
3. habe ich dein set /a kb=%bytesfree:~0,-3% mal in ein set /a kb=%bytesfree:~0,-4% ersetzen müssen, um das letzte Zeichen (ein Punkt) loszuwerden
4. Kommt dein Script nicht mit den . (Punkt) in der Zahl klar. Setze ich den Wert mal manuell fest fest, klappt es...
5. Nutze doch bitte die CODE-Tags hier
ich denke, wenn du Punkt 4 behoben hast, wird es klappen
Gruß
em-pie
1. mir fällt spontan auf, dass du in deinem Code bei set /a mb = kb/1024 vergessen hast, das kb in % einzuklammern..
2. und zum Debuggen solltest du zudem immer ein @echo on, statt @echo off machen.
3. habe ich dein set /a kb=%bytesfree:~0,-3% mal in ein set /a kb=%bytesfree:~0,-4% ersetzen müssen, um das letzte Zeichen (ein Punkt) loszuwerden
4. Kommt dein Script nicht mit den . (Punkt) in der Zahl klar. Setze ich den Wert mal manuell fest fest, klappt es...
5. Nutze doch bitte die CODE-Tags hier
ich denke, wenn du Punkt 4 behoben hast, wird es klappen
Gruß
em-pie
Zum Punkt 4
ich hatte zwischendurch echos mal eingbaut um zu sehen, was da so in den Variablen steht.
Wenn ich dein script habe ausführen lassen, wurde mir bereits bei der Variablen %bytesfree% 39.123.456 angezeigt (Win7, x86, SP1, deutsch).
Als ich den Wert mal auf 39123456 festgesetzt hatte, lief es durch...
Aber da du das Problem ja auch anders lösen konntest, ist ja alles tutti
ich hatte zwischendurch echos mal eingbaut um zu sehen, was da so in den Variablen steht.
Wenn ich dein script habe ausführen lassen, wurde mir bereits bei der Variablen %bytesfree% 39.123.456 angezeigt (Win7, x86, SP1, deutsch).
Als ich den Wert mal auf 39123456 festgesetzt hatte, lief es durch...
Aber da du das Problem ja auch anders lösen konntest, ist ja alles tutti
Hallo Zusammen,
Alternative, die mit größer Zahlen halbwegs umgehen kann:
Der von B2GiB zurückgegebene Errorlevelwert ist der freie Speicher in GB inclusive 2 Nachkommastellen (die aber noch nicht durch Komma getrennt sind).
Grüße
rubberman
Alternative, die mit größer Zahlen halbwegs umgehen kann:
@echo off &setlocal
for /f "delims=" %%i in ('wmic logicaldisk where "DeviceID='C:'" get FreeSpace /value') do (
for /f "tokens=2 delims==" %%j in ("%%i") do call :B2GiB %%j
)
set "free=%errorlevel%"
set "gb=%free:~0,-2%.%free:~-2%"
if %free% leq 1000 (echo Achtung! Nurnoch %gb% GB frei.) else echo %gb% GB frei.
pause
exit /b
:B2GiB
setlocal EnableDelayedExpansion
set "B=%~1"
set "highPart=%B:~0,-6%"
set "lowPart=%B:~-6%"
set /a "KB = highPart / 1024 * 1000000, borrow = highPart %% 1024"
if %borrow% gtr 0 (
set "lowPart=%borrow%%lowPart%""
) else (
for /l %%a in (1,1,5) do if "!lowPart:~0,1!" equ "0" set "lowPart=!lowPart:~1!"
)
set /a "KB += lowPart / 1024, GB = KB / 1048576, HH = KB %% 1048576 * 100 / 1048576"
if %HH% lss 10 set "HH=0%HH%"
endlocal &exit /b %GB%%HH%
Grüße
rubberman