CMD/BAT - [решено] получить размер каталога с подкаталогами
-
Loki3D
-
Loki3D
Re: CMD/BAT - [решено] получить размер каталога с подкаталогами
Из письма в ПМ:
Цитата sov44:
…не хочется постить большой скрипт в теме. Проблема в том, что в скрипте два цикла по удалению файлов. По отдельности они отрабатывают на ура, а если они в одном теле, второй цикл удаления файлов, уходит в бесконечность. Экспериментировал по разному, но безрезультатно.
Выкладывайте вопросы на форум.
Во-первых, у Вас в приложенном к письму пакетном файле две одинаковых метки «:CalcAndDel». Во-вторых, есть лишние «endlocal», которые могут вести к некорректным подсчётам (не проверялось). В-третьих, пакетный файл зацикливается оттого, что Вы сами так слепили его:
Код:
— ничего удивительного.
Можно попробовать так:
Код:
Как обычно, в примере удаление переделано в «echo».
Цитата sov44:
…не хочется постить большой скрипт в теме. Проблема в том, что в скрипте два цикла по удалению файлов. По отдельности они отрабатывают на ура, а если они в одном теле, второй цикл удаления файлов, уходит в бесконечность. Экспериментировал по разному, но безрезультатно.
Выкладывайте вопросы на форум.
Во-первых, у Вас в приложенном к письму пакетном файле две одинаковых метки «: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 ^
)
exit /b 0
rem ==========================================================================Как обычно, в примере удаление переделано в «echo».
-
Petya V4sechkin
Re: CMD/BAT - [решено] получить размер каталога с подкаталогами
Команда Diruse (
Файл
Diruse Examples
).Файл
Diruse.exe
можно взять из установочного CD \Support\Tools\suptools.msi (support.cab).-
gora
Re: CMD/BAT - [решено] получить размер каталога с подкаталогами
Код:
Кодировка кириллица DOS (866) обязательна.
Код: Выделить всё
@Echo Off
SetLocal enabledelayedexpansion
Set DirProg=c:\musor
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)
)
Echo !dirsize!
Pause>nulКодировка кириллица DOS (866) обязательна.
- Вложения
-
Loki3D
Re: CMD/BAT - [решено] получить размер каталога с подкаталогами
gora, Вариант хороший, но не мой случай, у меня задан набор каталогов, но способ оригинальный 
Petya V4sechkin, Большое спасибо за подсказку.

Petya V4sechkin, Большое спасибо за подсказку.
-
Oceanel
Re: CMD/BAT - [решено] получить размер каталога с подкаталогами
Цитата Oceanel:
Echo Размер папки = !dirsize!
Обьясните плиз, как сделать что бы размер показывался в кб\мб\гб
Echo Размер папки = !dirsize!
CMD/BAT - [решено] получить размер каталога с подкаталогами
Обьясните плиз, как сделать что бы размер показывался в кб\мб\гб
-
XFNeo
Re: CMD/BAT - [решено] получить размер каталога с подкаталогами
Цитата XFNeo:
как сделать что бы размер показывался в кб\мб\гб
C ГБ делать не стал, там числа будут близки к максимуму для CMD. Остальное как-то так:
Код:
как сделать что бы размер показывался в кб\мб\гб
CMD/BAT - [решено] получить размер каталога с подкаталогами
C ГБ делать не стал, там числа будут близки к максимуму для CMD. Остальное как-то так:
Код:
Код: Выделить всё
@Echo Off
SetLocal enabledelayedexpansion
Set DirProg=c:\Documents and Settings
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
Set kb=1024
Set /a mb=kb*kb, gb=kb*kb*kb, dirsizeKB=dirsize/kb, ostKB=dirsize%%kb*100/kb, dirsizeMB=dirsize/mb, ostMB=dirsize%%mb*100/mb
Rem Set /a dirsizeGB=dirsize/gb, ostGB=dirsize%%gb*10/gb
Echo %dirsize% Б
Echo %dirsizeKB%,%ostKB% кБ
Echo %dirsizeMB%,%ostMB% МБ
Rem Echo %dirsizeGB%,%ostGB% ГБ
Pause>nul-
gora
Re: CMD/BAT - [решено] получить размер каталога с подкаталогами
Если кому не сложно помогите разобраться в этом коде
Код:
Нужны комментарии ко всем командам.
Заранее благодарен
Код:
Код: Выделить всё
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) )Нужны комментарии ко всем командам.
Заранее благодарен
-
XFNeo
Re: CMD/BAT - [решено] получить размер каталога с подкаталогами
Цитата XFNeo:
Нужны комментарии ко всем командам.
Начнем со строки
Код:
Она выводит информацию о директории в нужном нам формате. Подробности о ключах посмотрите самостоятельно (Наберите Dir /? в окне консоли).
Можете запустить эту команду отдельно и увидите ее вывод примерно такой:
Код:
В цикле For производится построчный разбор этого вывода.
skip=4[/i] пропускаем первые 4 строки, т.к., в них не может быть нужной информации
tokens=1-3 каждую строку разбиваем на части по разделителям (они не определены, значит используются по умолчанию символы пробела и табуляции) и первые три части строки записываем в переменные (%%a, %%b и %%c).
В теле цикла ищем нужную строку, содержащую общий размер директории (это вторая снизу строка вывода).
Код:
Т.к. переменная flag не равна 1 то переходим к следующей строке батника и проверяем есть ли в переменной %%b нужное слово файлов: с двоеточием в конце!
Это слово появится только когда цикл дойдет до третьей с конца строки. В этом случае переменной flag будет присвоено значение 1. При обработке следующей строки вывода (предпоследняя строка) команда
Код:
сработает и запишет размер директории из %%c в переменную dirsize. После этого строка батника
Код:
снова сбросит переменную flag в 0, дабы не перезаписывать переменную dirsize при обработке последней строки вывода.
Нужны комментарии ко всем командам.
CMD/BAT - [решено] получить размер каталога с подкаталогами
Начнем со строки
Код:
Код: Выделить всё
Dir "%DirProg%" /-C /S /A:-DОна выводит информацию о директории в нужном нам формате. Подробности о ключах посмотрите самостоятельно (Наберите Dir /? в окне консоли).
Можете запустить эту команду отдельно и увидите ее вывод примерно такой:
Код:
Код: Выделить всё
Том в устройстве C не имеет метки.
Серийный номер тома: 74B4-362D
Содержимое папки c:\Musor
16.01.2010 23:50 3238 7z_SFX.ico
16.11.2010 10:34 5035 install_button.bat
22.01.2011 09:02 68608 nircmdc.exe
17.10.2008 14:54 2048 tasktool.exe
4 файлов 78929 байт
Содержимое папки c:\Musor\ADD_
21.01.2011 15:55 4419 ConfigSetupButton.txt
22.06.2010 14:52 670 Copyright.res
13.05.2010 22:44 68416 RC.exe
13.05.2010 22:44 331080 RcDll.dll
24.03.2002 20:23 881664 ResHacker.exe
20.01.2011 15:25 873 Version.rc
6 файлов 1287122 байт
Содержимое папки c:\Musor\lang
02.02.2011 08:43 4759 1033.ini
02.02.2011 18:40 4557 1049.ini
02.02.2011 11:11 4597 1058.ini
3 файлов 13913 байт
Содержимое папки c:\Musor\SFX Tool
07.01.2011 10:06 113152 7zsd_All.sfx
07.01.2011 10:06 92672 7zsd_Deflate.sfx
07.01.2011 10:06 97792 7zsd_LZMA.sfx
07.01.2011 10:06 100352 7zsd_LZMA2.sfx
07.01.2011 10:06 135680 7zsd_LZMA_Dialogs.sfx
07.01.2011 10:06 92160 7zsd_PPMd.sfx
21.01.2011 16:09 308620 Button.chm
26.06.2007 19:22 53 Desktop.ini
02.02.2011 10:58 2270 Settings.ini.new
9 файлов 942751 байт
Всего файлов:
22 файлов 2322715 байт
0 папок 8314302464 байт свободноВ цикле For производится построчный разбор этого вывода.
skip=4[/i] пропускаем первые 4 строки, т.к., в них не может быть нужной информации
tokens=1-3 каждую строку разбиваем на части по разделителям (они не определены, значит используются по умолчанию символы пробела и табуляции) и первые три части строки записываем в переменные (%%a, %%b и %%c).
В теле цикла ищем нужную строку, содержащую общий размер директории (это вторая снизу строка вывода).
Код:
Код: Выделить всё
If !flag!==1 Set dirsize=%%c
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)Т.к. переменная flag не равна 1 то переходим к следующей строке батника и проверяем есть ли в переменной %%b нужное слово файлов: с двоеточием в конце!
Это слово появится только когда цикл дойдет до третьей с конца строки. В этом случае переменной flag будет присвоено значение 1. При обработке следующей строки вывода (предпоследняя строка) команда
Код:
Код: Выделить всё
If !flag!==1 Set dirsize=%%cсработает и запишет размер директории из %%c в переменную dirsize. После этого строка батника
Код:
Код: Выделить всё
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)снова сбросит переменную flag в 0, дабы не перезаписывать переменную dirsize при обработке последней строки вывода.
-
gora
Re: CMD/BAT - [решено] получить размер каталога с подкаталогами
Есть скрипт для удаления временных файлов. Подскажите, как его дополнить, чтобы получить общую сумму удалённых файлов, в мегабайтах до десятых.
Код:
Код:
Код: Выделить всё
@Echo Off
color 1a
mode con: cols=57 lines=16
echo.
echo -----------------------------------------------------
echo “„Ђ‹…Ќ?… ‚ђ…Њ…ЌЌ›• ”Ђ‰‹Ћ‚
echo -----------------------------------------------------
echo.
echo.
PUSHD "%WinDir%\TEMP"
2>Nul RD /S/Q "%WinDir%\TEMP"
POPD
echo ЋзЁбвЄ* Ї*ЇЄЁ ’emp - OK
set Opera_temp=%USERPROFILE%\Local Settings\Application Data\Opera\opera\cache
PUSHD "%Opera_temp%"
2>Nul RD /S/Q "%Opera_temp%"
POPD
echo ЋзЁбвЄ* ўаҐ¬Ґ**ле д*©«®ў Opera - OK
if exist "%AppData%\Opera\Opera\typed_history.xml" del "%AppData%\Opera\Opera\typed_history.xml"
if exist "%AppData%\Opera\Opera\global_history.dat" del "%AppData%\Opera\Opera\global_history.dat"
echo ЋзЁбвЄ* Ёбв®аЁЁ ў Opera - OK
set IE_temp=%USERPROFILE%\Local Settings\Temporary Internet Files
PUSHD "%IE_temp%"
2>Nul RD /S/Q "%IE_temp%"
POPD
echo ЋзЁбвЄ* ўаҐ¬Ґ**ле д*©«®ў Internet Explorer - OK
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
echo.
echo.
echo ЋзЁбвЄ* ўлЇ®«*Ґ**, г¤*«Ґ*® ее,е ЊЎ.
ping 127.0.0.1 -n 8 > nul