Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

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

Googler


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

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


sov44, не совсем понимаю, зачем нужна такая точность, по мне так вполне хватило бы обычного округления до Mb. Разве только из спортивного интереса. Для заявленных в скрипте требований понадобится аж три дополнительных ф-ции:

- сложения двойных чисел (для суммирования объема по всем дискам);
- последовательного деления на 2 (для преобразования byte -> Kb -> Mb);
- последовательного умножения на 2 (для вычисления остатка при округлении)

читать дальше »
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion

rem Очистка корзины на всех дисках
Set Cnt=0& Set dirsize4=0
For %%d IN (Z Y X W U V T S R Q P O N M L K J I H G F E D C) Do (
 Set "DirProg=%%d:\RECYCLER"& Set "flag=0"
 If EXIST !DirProg! (For /F "Skip=4 Tokens=1-3" %%a In ('DIR/-C/S/A:-D "!DirProg!"2^>Nul') Do (
      If !flag!==1 Set dirsize4=%%c
      If "%%b"=="файлов:" (Set flag=1) Else Set flag=0)
 Call:SUM !Cnt! !dirsize4! Cnt
))

Set rst=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches
REG Add "%rst%\Recycle Bin" /v StateFlags0001 /t REG_DWORD /d 2 /f >nul
REG Delete "%rst%\Compress old files" /f 2>nul
Cleanmgr /sagerun:1
echo  Очистка корзины на всех дисках                - OK
rem ------------------------------------------------------------------------

Call:UDIV2 %Cnt% dirsizeMB  20
Call:UMUL2 %dirsizeMB% CntT 20
Call:SUM %Cnt% -%CntT% ost

Set/a $.mb=(%ost%*100)/(1024*1024)
Set "$.mb=0%$.mb%"& Set "$.mb=!$.mb:~-2!"

echo/
echo/
echo  Очистка выполнена, всего удалено %dirsizeMB%,%$.mb% Мб

ping 127.0.0.1 -n 7 >nul
pause
exit

:SUM  %uint%  %uint%  %VarRes%
::----------------------------
SETLOCAL EnableDelayedExpansion
(set "$a=%~1"& set "$b=%~2"
 if "!$a:~,1!"=="-" (set "$az=-"&set "$a=!$a:-=!") else set "$az="
 if "!$b:~,1!"=="-" (set "$bz=-"&set "$b=!$b:-=!") else set "$bz="
 for /f "tokens=* delims=0" %%i in ("!$a:~-9!") do set/a "$al=%%i+0"&set/a "$ah=!$a:~,-9!+0"
 for /f "tokens=* delims=0" %%i in ("!$b:~-9!") do set/a "$bl=%%i+0"&set/a "$bh=!$b:~,-9!+0"

 set/a "$sl=(!$az!!$al!)+(!$bz!!$bl!)"&set/a $p=!$sl:~,-9!+0&set/a "$sl=!$sl!-(!$p!000000000)"
 set/a "$sh=(!$az!!$ah!)+(!$bz!!$bh!)+(!$p!+0)"
 if !$sh! gtr 0 if !$sl! lss 0 set/a $sh-=1& set/a "$sl=(1000000000+!$sl!)"
 if !$sh! lss 0 if !$sl! gtr 0 set/a $sh+=1& set/a "$sl=(!$sl!-1000000000)"
 for /f "delims=0123456789" %%i in ("!$sh!!$sl!") do set "$z=%%i"
 if !$sh! equ 0 if !$sl! equ 0 set "$z=0"
 set "$sl=00000000!$sl:-=!"
)
 for /f "tokens=* delims=0" %%i in ("!$sh:-=!!$sl:~-9!") do ENDLOCAL& set "%~3=%$z%%%i"
GoTo:EOF

:UDIV2  %uint% %VarRes% %uint%
::----------------------------
 SETLOCAL EnableDelayedExpansion
(set "$a=%~1"& set/a "$c=%~3+0"& if !$c! equ 0 set "$c=1"
 for /f "tokens=* delims=0" %%i in ("!$a:~-9!") do set/a "$al=%%i+0,$ah=!$a:~,-9!+0"
 for /l %%i in (1,1,!$c!) do (
   set/a "$p=$ah&1,$ah>>=1,$al>>=1"
   if !$p!==1 set/a $al=$al+500000000)
 set "$z="& if !$ah! equ 0 if !$al! equ 0 set "$z=0"
)
 for /f "tokens=* delims=0" %%i in ("!$ah!!$al!") do ENDLOCAL& set "%~2=%$z%%%i"
GoTo:EOF

:UMUL2  %uint% %VarRes% %uint%
::----------------------------
(SETLOCAL EnableDelayedExpansion
 set %~2=%~1& set/a "$c=%~3+0"& if !$c! equ 0 set "$c=1"
 for /l %%i in (1,1,!$c!) do Call:SUM !%~2! !%~2! %~2
 for /f %%i in ("!%~2!") do ENDLOCAL& set "%~2=%%i"
)
GoTo:EOF


P.S. подсвеченную строку отредактировал, т.к. не понял её смысл в оригинале

Последний раз редактировалось amel27, 05-05-2011 в 13:57. Причина: ошибка

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

Отправлено: 12:01, 03-05-2011 | #30