CMD/BAT - [решено] получить размер каталога с подкаталогами

Ответить
Аватара пользователя
Loki3D

Re: CMD/BAT - [решено] получить размер каталога с подкаталогами

Сообщение Loki3D »

Из письма в ПМ:


Цитата 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 - [решено] получить размер каталога с подкаталогами

Сообщение Petya V4sechkin »

Команда Diruse (
Diruse Examples
).

Файл
Diruse.exe
можно взять из установочного CD \Support\Tools\suptools.msi (support.cab).
Аватара пользователя
gora

Re: CMD/BAT - [решено] получить размер каталога с подкаталогами

Сообщение gora »

Код:

Код: Выделить всё

@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) обязательна.
Вложения
diruse.zip
(5.8 КБ) 0 скачиваний
diruse.zip
(5.8 КБ) 0 скачиваний
Аватара пользователя
Loki3D

Re: CMD/BAT - [решено] получить размер каталога с подкаталогами

Сообщение Loki3D »

gora, Вариант хороший, но не мой случай, у меня задан набор каталогов, но способ оригинальный Изображение

Petya V4sechkin, Большое спасибо за подсказку.
Аватара пользователя
Oceanel

Re: CMD/BAT - [решено] получить размер каталога с подкаталогами

Сообщение Oceanel »

Цитата Oceanel:



Echo Размер папки = !dirsize!
CMD/BAT - [решено] получить размер каталога с подкаталогами




Обьясните плиз, как сделать что бы размер показывался в кб\мб\гб
Аватара пользователя
XFNeo

Re: CMD/BAT - [решено] получить размер каталога с подкаталогами

Сообщение XFNeo »

Цитата XFNeo:



как сделать что бы размер показывался в кб\мб\гб
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 - [решено] получить размер каталога с подкаталогами

Сообщение gora »

Если кому не сложно помогите разобраться в этом коде



Код:

Код: Выделить всё

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 »

Цитата XFNeo:



Нужны комментарии ко всем командам.
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 - [решено] получить размер каталога с подкаталогами

Сообщение gora »

Есть скрипт для удаления временных файлов. Подскажите, как его дополнить, чтобы получить общую сумму удалённых файлов, в мегабайтах до десятых.



Код:

Код: Выделить всё

 
@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
Ответить

Вернуться в «Скриптовые языки администрирования Windows»