|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Неверное число. Числа ограничены 32 битами точности. |
|
CMD/BAT - Неверное число. Числа ограничены 32 битами точности.
|
Ветеран Сообщения: 1202 |
Даю батнику команду:
set /a TotalSelectSize=%HomeMB%+%WinXPMB%+%Win7MB%+%LiveCDMB%+%HirenMB%+%RecoverMB%+%DriverMB%+%WPIMB%+%SoftMB% set /a TotalSelectSize=24006839+597176320+4032823296+601608192+493252608+1663288361+4679008256+2420684800+29275962 Неверное число. Числа ограничены 32 битами точности. Пробовал делать так: и т.д. Тогда ошибки не появляется, но зато некоторые значения получаются корректные, т.е. 24006839 --> 24, а некоторые нет, например, 4032823296 --> -262 Не пойму никак почему такое происходит. |
|
------- Отправлено: 07:27, 14-05-2012 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата sLiDeR-X:
|
|
Отправлено: 07:40, 14-05-2012 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1202
|
Профиль | Отправить PM | Цитировать У меня задача посчитать размер определенных папок + файлов и вывести значения посчитанных папок и файлов в переменные для дальнейшей работы.
|
------- Отправлено: 07:44, 14-05-2012 | #3 |
Сообщения: 53482
|
Профиль | Отправить PM | Цитировать |
Отправлено: 08:08, 14-05-2012 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать sLiDeR-X, ну, выведете Вы эти значения в переменные. А дальше-то что? Не думаете ли Вы, что проблема только в «set /a», и стоит её как-нибудь решить, то «дальше мы уж как-нибудь разберёмся»?! Вот Вам простой пример:
@echo off setlocal enableextensions enabledelayedexpansion set TotalSelectSize=3000000000 set sTerminateSize=20000000000 if %TotalSelectSize% lss %sTerminateSize% ( echo %TotalSelectSize% echo меньше чем echo %sTerminateSize% ) else ( echo %TotalSelectSize% echo больше чем echo %sTerminateSize% ) endlocal exit /b 0 |
|
Отправлено: 08:23, 14-05-2012 | #5 |
Ветеран Сообщения: 1202
|
Профиль | Отправить PM | Цитировать Iska, это все понятно...
Для себя в этом же скрипте делаю так: set "TotalSelectSize_=000000000000000000%TotalSelectSize%"& set "TotalSelectSize_=!TotalSelectSize_:~-18!" set "$FreeDiskSize_=000000000000000000%$FreeDiskSize%"& set "$FreeDiskSize_=!$FreeDiskSize_:~-18!" if "%TotalSelectSize_%" LEQ "%$FreeDiskSize_%" (call :BigDisk) else (call :SmallDisk) Вывернулся вот таким способом: for /f "skip=4 tokens=1-3" %%a IN ('dir "___Main\" /-C /S /A:-D') do ( if !flag!==1 set HomeMB=%%c if "%%b"=="файлов:" (set flag=1) else (set flag=0) ) set /a HomeMB=%HomeMB%/1000000 echo HomeMB %HomeMB% for %%i in (%RDS_Sourse%\WindowsXP\*.iso) do set WinXPMB=%%~zi set WinXPMB=%WinXPMB:~0,-6% echo WinXPMB %WinXPMB% и т.д. set /a TotalSelectSize=%HomeMB%+%WinXPMB%+%Win7MB%+%LiveCDMB%+%HirenMB%+%RecoverMB%+%DriverMB%+%WPIMB%+%SoftMB% echo TotalSelectSize %TotalSelectSize% что и хотел ![]() |
------- Отправлено: 09:04, 14-05-2012 | #6 |
Старожил Сообщения: 207
|
Профиль | Отправить 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 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
C/C++ - Разбить число с перестановкой разрядов числа по убыванию | user8605 | Программирование и базы данных | 1 | 07-02-2012 16:55 | |
Ограничены права | spilberg | Microsoft Windows NT/2000/2003 | 2 | 14-12-2010 00:11 | |
Новый рекорд точности вычисления Пи: два квадриллиона знаков после запятой | OSZone News | Новости информационных технологий | 1 | 17-09-2010 17:31 | |
VBA - Что за ошибка ERROR [HY104] Недопустимое значение точности | Большой Кол | Программирование и базы данных | 1 | 17-05-2010 01:40 | |
Доступ - ограничены права Администратора других учётных записей | alexandri | Microsoft Windows 2000/XP | 2 | 23-02-2009 18:29 |
|