functionstrut
Goto Top

Wenn XX freier speicher dann goto

Hallo face-smile

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?

Content-Key: 331305

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

Ausgedruckt am: 28.03.2024 um 22:03 Uhr

Mitglied: em-pie
Lösung em-pie 06.03.2017 um 11:29:53 Uhr
Goto Top
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 face-wink

ich denke, wenn du Punkt 4 behoben hast, wird es klappen


Gruß
em-pie
Mitglied: functionstrut
functionstrut 06.03.2017 um 11:58:44 Uhr
Goto Top
vielen Dank für deine Mühe face-smile

habe zeitgleich auch nochmal gefummelt und habe rausbekommen das es ohne die erste zeile:
@setlocal enableextensions enabledelayedexpansion

einwandfrei funktioniert.

zu 4: wieso ein punkt? ich habe in den beiden zahlen doch keinen punkt gehabt.

zu 5: wird gemacht in zukunft face-smile
Mitglied: em-pie
em-pie 06.03.2017 um 12:10:48 Uhr
Goto Top
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 face-smile
Mitglied: rubberman
rubberman 06.03.2017 um 12:28:31 Uhr
Goto Top
Hallo Zusammen,

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%
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