Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Набросал вот. Можно оперировать очень большими числами, а также дробными. В коде функция и наглядный пример использования

ps. Вообще, конечно, BAT это ЖЕСТЬ и писать на нем могут только упоротые маньяки. Типичная проблема - поиск неправильной закорючки и попытка понять, как надо расставить закорючки, чтобы оно не ругалось. Результат выполнения if %PercentFree% LSS %MinPercentFree% если числа содержат запятую меня просто убил - выполняются обе ветки IF, пришлось менять на if %PercentFree:,=% LSS %MinPercentFree:,=% (

Код: Выделить весь код
@echo off

setlocal enabledelayedexpansion

set BatMaximum=0xFFFFFFFF
set /a BatMaximum=BatMaximum+0

echo Calculating: %BatMaximum% + 2
set /a InvalidResult=BatMaximum+2
echo Invalid result: %InvalidResult%
call :Calculate "%BatMaximum% + 2"
echo Right result: "%CalcResult%"

echo ---- more samples: ----

set TotalDiskSize=512*1024*1024*1024
set FreeSpace=32*1024*1024*1024
set MinPercentFree=0,100

call :Calculate %TotalDiskSize%
set TotalDiskSize=%CalcResult%

call :Calculate -delim %TotalDiskSize% 15
echo Disk size : %CalcResult% bytes

call :Calculate %FreeSpace%
set FreeSpace=%CalcResult%

call :Calculate -delim %FreeSpace% 15
echo Free space: %CalcResult% bytes

call :Calculate "(%FreeSpace%)/(%TotalDiskSize%)" 5 3
set PercentFree=%CalcResult%

if %PercentFree:,=% LSS %MinPercentFree:,=% (
   echo Too low free disk space: %PercentFree%%%, must be minimum: %MinPercentFree%%%
) else (
   echo Free space is enough: %PercentFree%%%
)
exit

::===========
:Calculate
::===========
:: Params: [-debug] [-delim] %1=Formula [%2=Len [%3=Dec] ]
:: Return: %CalcResult%
set Calculate.StdOut=StdOut%Random%.tmp
set Calculate.Vbs=Calc%Random%.vbs
set Calculate.UseDelim=False
set Calculate.Debug=False

:Calculate.ParseParam

rem echo %1 %2 %3 %4 %5 loop Calculate.Debug=%Calculate.Debug%

if /i "%~1"=="-debug" (
   shift
   set Calculate.Debug=True
   goto Calculate.ParseParam
)
if /i "%~1"=="-delim" (
   shift
   set Calculate.UseDelim=True
   goto Calculate.ParseParam
)

if %Calculate.Debug%==True (
   echo Formula: "%~1"
)

>%Calculate.Vbs% (
echo Set FSO = CreateObject^("Scripting.FileSystemObject"^)
echo Set TF = FSO.CreateTextFile^("%Calculate.StdOut%",True^)
echo on error resume next
)
echo Result=%~1 >>%Calculate.Vbs%
if not "%2"=="" (
   if not "%3"=="" (
      echo Result = FormatNumber^(Result, %3,,, %Calculate.UseDelim% ^) >>%Calculate.Vbs%
   ) else (
      echo Result = FormatNumber^(Result,  0,,, %Calculate.UseDelim% ^) >>%Calculate.Vbs%
   )
   >>%Calculate.Vbs% (
      echo If Len^(Result^) ^< %2 Then
      echo    Result = String ^( %2 - Len^(Result^), chr^(32^) ^) + Result
      echo End If
   )
)
>>%Calculate.Vbs% (
echo TF.Write Result
echo TF.Close
)
%Calculate.Vbs%
for /f "delims=■" %%i in (%Calculate.StdOut%) do (
    set CalcResult=%%i
)

del %Calculate.StdOut% >nul 2>&1
del %Calculate.Vbs% >nul 2>&1
:goto eof

-------
Кибер Мюсли


Последний раз редактировалось CyberMuesli, 21-05-2012 в 01:38. Причина: изменение параметров уведомления

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:47, 20-05-2012 | #7