Показать полную графическую версию : [решено] получить размер каталога с подкаталогами
Из письма в ПМ:
…не хочется постить большой скрипт в теме. Проблема в том, что в скрипте два цикла по удалению файлов. По отдельности они отрабатывают на ура, а если они в одном теле, второй цикл удаления файлов, уходит в бесконечность. Экспериментировал по разному, но безрезультатно.
Выкладывайте вопросы на форум.
Во-первых, у Вас в приложенном к письму пакетном файле две одинаковых метки «:CalcAndDel». Во-вторых, есть лишние «endlocal», которые могут вести к некорректным подсчётам (не проверялось). В-третьих, пакетный файл зацикливается оттого, что Вы сами так слепили его:
…
:m1
rem Очистка введённых адресов в Mazilla
if not exist "%programfiles%\Mozilla Firefox" echo Очистка введённых адресов в Mazilla - -- ^ & goto m2
for /f "usebackq tokens=2 delims==" %%i in (`type "%APPDATA%\Mozilla\Firefox\profiles.ini"^|find.exe "Path="`) do ^
set MF_his=%AppData%\Mozilla\Firefox\%%i
set /a iSum = 0
call :CalcAndDel "%MF_his%\places.sqlite"
call :CalcAndDel "%MF_his%\places.sqlite-wal"
call :CalcAndDel "%MF_his%\places.sqlite-shm"
Set /A Cnt +=%iSum%
echo Очистка введённых адресов в Mazilla - OK
goto m1
endlocal
exit /b 0
— ничего удивительного.
Можно попробовать так:
@echo off
setlocal enableextensions enabledelayedexpansion
set /a iTotalSize = 0
rem Очистка введённых адресов в Opera
if exist "%ProgramFiles%\Opera" (
echo Очистка истории в Opera
call :CalcAndDel "%AppData%\Opera\Opera\typed_history.xml"
call :CalcAndDel "%AppData%\Opera\Opera\global_history.dat"
call :CalcAndDel "%AppData%\Opera\Opera\search_field_history.dat"
)
echo.
rem Очистка введённых адресов в Mozilla Firefox
if exist "%ProgramFiles%\Mozilla Firefox" (
echo Очистка введённых адресов в Mozilla Firefox
for /f "usebackq tokens=2 delims==" %%i in (
`type "%AppData%\Mozilla\Firefox\profiles.ini"^|find.exe /i "Path="`
) do set sProfile=%AppData%\Mozilla\Firefox\%%i
if defined sProfile (
call :CalcAndDel "!sProfile!\places.sqlite"
call :CalcAndDel "!sProfile!\places.sqlite-wal"
call :CalcAndDel "!sProfile!\places.sqlite-shm"
)
)
echo %iTotalSize%
set /a kb = 1024
set /a mb = kb * kb, dirsizeMB = iTotalSize / mb, ostMB = iTotalSize %% mb * 100 / mb
echo.
echo Очистка выполнена, всего удалено %dirsizeMB%,%ostMB% Мб
endlocal
exit /b 0
rem ==========================================================================
rem ==========================================================================
:CalcAndDel
set sFile=%~1
if defined sFile (
if exist "%sFile%" (
set /a iTotalSize += %~z1
echo del /f /q "%sFile%"
) else (
echo Not found file [%sFile%]
)
) else (
echo Error call procedure: need argument ^<file^>
)
exit /b 0
rem ==========================================================================
Как обычно, в примере удаление переделано в «echo».
упс.. действительно проглядел m1
Iska, нужна такая структура, чтобы каждый цикл обрабатывался самостоятельно. Иными словами два независимых скрипта в одном теле. (между этими скриптами планируется вставить другие скрипты)
Изменил goto m1 на goto m2, цикл вышел из бесконечности. Надеюсь это решит проблему :)
gora, поясните пожалуйста часть скрипта (пост 7), какой смысл прибавления к dirsize нуля и дальнейшего сравнения %dirsizeT%" и %dirsize%? Какие есть ограничения по размеру обработки командного файла?
For /F "skip=4 tokens=1-3" %%a IN ('Dir "%DirProg%" /-C /S /A:-D') Do (
If !flag!==1 Set dirsize=%%c
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
)
Set /a dirsizeT=dirsize+0
If Not "%dirsizeT%"=="%dirsize%" Echo Число %dirsize% слишком велико для обработки в CMD&Pause>nul&Exit
1 какой смысл прибавления к dirsize нуля и дальнейшего сравнения %dirsizeT%" и %dirsize%? 2 Какие есть ограничения по размеру обработки командного файла? »
1 Проверка числа, на "не превышение" максимально допустимого значения.
2 Максимальное значение число для арифметики в CMD = 2^31 - 1 (2147483647)
Снова нужна помощь по скрипту
@Echo Off
SetLocal enabledelayedexpansion
rem Очистка корзины на всех дисках
Set Cnt=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 (
IF EXIST %%d:\RECYCLER (
SET DirProg=%%d:\RECYCLER
For /F "skip=4 tokens=1-3" %%a IN ('Dir "!DirProg!" /-C /S /A:-D ') Do (
If !flag!==1 Set dirsize4=%%c
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
)
Set /A Cnt +=dirsize4
)
)
set rst=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches
Reg Add "%rst%\Recycle Bin" /v StateFlags0001 /t REG_DWORD /d 2 /f | Echo Off
For /F "UseBackQ Tokens=2*" %%I In (`Reg Query %rst%^|Find /I "Compress old files"`) Do Reg Delete "%rst%\Compress old files" /f | Echo Off
Cleanmgr /sagerun:1
echo Очистка корзины на всех дисках - OK
rem ------------------------------------------------------------------------
Set /a CntT=%Cnt%+0
If Not "%CntT%"=="%Cnt%" Echo Количество временных файлов велико для обработки &ping 127.0.0.1 -n 7 > nul&Exit
rem Максимальное значение число для арифметики в CMD = 2^30 - 1 (2147483647 = 2048 Mb. )
Set kb=1024
Set /a mb=kb*kb, dirsizeMB=CntT/mb, ostMB=CntT%%mb*100/mb
echo.
echo.
echo Очистка выполнена, всего удалено %dirsizeMB%,%ostMB% Мб
ping 127.0.0.1 -n 7 > nul
pause
При вставленной в комп флешке появляется ошибка, скрипт не ругается на перебор размера для обработки.
Второй день экспериментирую и не могу понять, почему размер корзины при переборе 2147483647 получается со знаком минус и не появляется сообщение "Количество временных файлов велико для обработки" . Хелп! !!!
не могу понять, почему размер корзины при переборе 2147483647 получается со знаком минус и не появляется сообщение "Количество временных файлов велико для обработки" . Хелп! !!! »
не могу понять, почему размер корзины при переборе 2147483647 получается со знаком минус и не появляется сообщение "Количество временных файлов велико для обработки" »
Данный вид проверки не предназначен для решаемой Вами задачи. Таким способом можно проверить только число получаемое при подсчете размера отдельной папки производимого командой Dir (собственно такую задачу я и решал приведенным способом).
Вы пытаетесь проверить результат сложения двух и более чисел. В этом случае каждое из слагаемых может быть меньше 2147483647, но сумма уже может быть больше указанного числа. При этом число становится отрицательным.
Можно попробовать слагаемые проверять и сразу превращать в КБ или МБ и уже затем складывать. Точность конечно снижается, но другого варианта счета в CMD таких больших чисел я не знаю.
другого варианта счета в CMD таких больших чисел я не знаю »
поразрядно: CMD/BAT - Расширение 32-битной арифметики (http://forum.oszone.net/showthread.php?t=190002)
amel27, покажите,как отредактировать скрипт поста 25 с учетом этой инфы?
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. подсвеченную строку отредактировал, т.к. не понял её смысл в оригинале
не совсем понимаю, зачем нужна такая точность, по мне так вполне хватило бы обычного округления до Mb »
Согласен, Вы правы.
подсвеченную строку отредактировал, т.к. не понял её смысл в оригинале »
Списал где-то этот кусок. Обьяснить не могу. Пологаю, что для более полной очистки корзины. :)
FiFallcon
03-05-2011, 19:32
В одном из первых постов gora пишет про то что нужно включить кодировку.... Как это сделать? Оо
FiFallcon, попробуй в Notepad: файл - сохранить как - кодировка:866
или строка в тексте скрипта: chcp 866
FiFallcon, попробуй в Notepad: файл - сохранить как - кодировка:866 »
У Вас какой notepad.exe?
У Вас какой notepad.exe? »
упс... Ошибочка вышла. :blush2: Не Notepad а AkelPad (v. 4.5.5 в Total Commander)
amel27, при повторном запуске скрипта (пост 30) выскакивает ошибка.
sov44, Вы ж не первый день здесь: какая именно ошибка (точное сообщение), на какой команде…
какая именно ошибка (точное сообщение), на какой команде… »
Ошибка - отсутствующий операнд при запуске скрипта с пустой корзиной. Скрин во вложении.
отсутствующий операнд при запуске скрипта с пустой корзиной »исправил
Хочу прикрутить к скрипту (пост 30) проверку на наличие папки RECYCLER
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 IF NOT EXIST %%d:\RECYCLER goto m3
, однако не разобрался в скрипте, куда приткнуть m3. Нужна подсказка.
куда приткнуть m3 »не понятен смысл этой задумки
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.