yakazaa
Goto Top

Batch: Wert aus Zeile herausfiltern und dann Bytes in Gigabytes umrechnen

Hallo zusammen,

ich habe mir mit viel Bastelei eine Textdatei %HOSTNAME%.txt erzeugen lassen in der jeweils nur diese eine Zeile steht:

12 Dir(s) 37.184.610.304 bytes free

Ist halt die letzte Zeile des DIR Befehls, diese wird zentral von ca. 100 Systemen eingesammelt.

Jetzt rechne ich seltenst in Bytes und möchte diesen Wert daher in Gigabytes umrechnen lassen, am liebsten auch per Script - aber wie?
Zuerst müsste ich ja den Wert erstmal als solchen isolieren, aber dann?

Freue mich auf eure Ideen,
Dominik

Content-Key: 237535

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

Printed on: April 18, 2024 at 03:04 o'clock

Member: ThomasM
ThomasM May 08, 2014 updated at 18:09:01 (UTC)
Goto Top
Bei dieser Zahlengröße wirst du die Fehlermeldung "Ungültige Zahl. Zahlen sind begrenzt auf eine Genauigkeit von 32 Bits.", da Du in CMD nur mit Zahlen von -2147483648 bis 2147483647 rechnen kannst.

Ich hab es grad getestet. Das Auschneiden von Werten ist ganz gut im Netz erklärt. Einfach mal googeln. Das hilft dir an dieser Stelle aber nicht weiter. Du solltest daher z.B. über ein VBScript gehen.

Das gleiche Problem wurde hier schon einmal besprochen. Daher anbei der Link.
Umrechnung von Byte auf Gigabyte
Member: bastla
bastla May 08, 2014 at 18:35:59 (UTC)
Goto Top
Hallo yakazaa!

Wie ThomasM (BTW: Willkommen im Forum!) schon erklärt hat, kann das ein Batch arithmetisch nicht leisten - was allerdings ginge, wäre die Byte-Angabe zunächst als Text zu interpretieren und dann durch Weglassen von 9 Stellen am Ende zu einer durch 1 Milliarde dividierten (abgerundeten) Zahl zu machen - für Dein dir etwa so:
@echo off & setlocal
for /f "tokens=3" %%i in ('dir /-c D:') do set "B=%%i"  
set "GB=%B:~,-9%"  
if not defined GB (
    echo weniger als 1 GB frei
) else (
    echo mindestens %GB% GB frei
)
Grüße
bastla
Member: rubberman
rubberman May 08, 2014 updated at 19:07:13 (UTC)
Goto Top
Hallo Dominik,

unabhängig davon, dass man vermutlich nicht mit einer temporären Datei arbeiten muss und dass der DIR Befehl zudem die Option /-C unterstützt, um das Tausendertrennzeichen zu unterdrücken, gibt es auch Workarounds für Batch pur um das 32Bit Limit zu umschiffen.
Bspw.:
@echo off &setlocal

set "line=12 Dir(s) 37.184.610.304 bytes free"  
for /f "tokens=3" %%i in ("%line:.=%") do call :B2GiB %%i  
echo %errorlevel:~0,-2%,%errorlevel:~-2%
pause

goto :eof

: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%
Versteht sich von selbst, dass man den Wert für die Variable line auch aus deiner Datei einlesen kann.
<"%HOSTNAME%.txt" set /p "line="

Grüße
rubberman

EDIT: DelayedExpansion vergessen face-plain
Member: ThomasM
ThomasM May 08, 2014 at 18:51:25 (UTC)
Goto Top
Na siehste, mal wieder was dazu gelernt. ;)
Member: ThomasM
ThomasM May 08, 2014 updated at 18:59:46 (UTC)
Goto Top
Zitat von @bastla:
(BTW: Willkommen im Forum!)

Danke. Hab mich gerade angemeldet, da ich seit letzter Woche der neue Admin bin. Der alte Admin in meiner Firma hatte keine Lust mehr. Ich hab bisher mehr Clients und CAD-Systeme betreut. Von Servern hab ich schon gute 8 Jahre nichts mehr gesehen. ^^