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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] получить размер каталога с подкаталогами

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

Аватара для Loki3D

Старожил


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

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


подскажите, возможно ли это и как?

-------
sory 4 my rus


Отправлено: 15:15, 27-11-2009

 

Ветеран


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

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


Из письма в ПМ:
Цитата 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 ^<file^>
	)

	exit /b 0
rem ==========================================================================
Как обычно, в примере удаление переделано в «echo».
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:51, 04-04-2011 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


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

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


упс.. действительно проглядел m1

Iska, нужна такая структура, чтобы каждый цикл обрабатывался самостоятельно. Иными словами два независимых скрипта в одном теле. (между этими скриптами планируется вставить другие скрипты)

Изменил goto m1 на goto m2, цикл вышел из бесконечности. Надеюсь это решит проблему

Последний раз редактировалось sov44, 04-04-2011 в 09:28.


Отправлено: 09:05, 04-04-2011 | #22


Ветеран


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

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


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

Отправлено: 15:17, 07-04-2011 | #23


Аватара для gora

Ушёл из жизни


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

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


Цитата sov44:
1 какой смысл прибавления к dirsize нуля и дальнейшего сравнения %dirsizeT%" и %dirsize%? 2 Какие есть ограничения по размеру обработки командного файла? »
1 Проверка числа, на "не превышение" максимально допустимого значения.
2 Максимальное значение число для арифметики в CMD = 2^31 - 1 (2147483647)

Последний раз редактировалось gora, 29-04-2011 в 10:53. Причина: исправил число

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

Отправлено: 16:21, 07-04-2011 | #24


Ветеран


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

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


Снова нужна помощь по скрипту
Код: Выделить весь код
@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 получается со знаком минус и не появляется сообщение "Количество временных файлов велико для обработки" . Хелп! !!!

Последний раз редактировалось sov44, 29-04-2011 в 10:38.


Отправлено: 20:57, 27-04-2011 | #25


Ветеран


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

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


Цитата sov44:
не могу понять, почему размер корзины при переборе 2147483647 получается со знаком минус и не появляется сообщение "Количество временных файлов велико для обработки" . Хелп! !!! »

Отправлено: 10:39, 29-04-2011 | #26


Аватара для gora

Ушёл из жизни


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

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


Цитата sov44:
не могу понять, почему размер корзины при переборе 2147483647 получается со знаком минус и не появляется сообщение "Количество временных файлов велико для обработки" »
Данный вид проверки не предназначен для решаемой Вами задачи. Таким способом можно проверить только число получаемое при подсчете размера отдельной папки производимого командой Dir (собственно такую задачу я и решал приведенным способом).
Вы пытаетесь проверить результат сложения двух и более чисел. В этом случае каждое из слагаемых может быть меньше 2147483647, но сумма уже может быть больше указанного числа. При этом число становится отрицательным.
Можно попробовать слагаемые проверять и сразу превращать в КБ или МБ и уже затем складывать. Точность конечно снижается, но другого варианта счета в CMD таких больших чисел я не знаю.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:14, 29-04-2011 | #27


Googler


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

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


Цитата gora:
другого варианта счета в CMD таких больших чисел я не знаю »
поразрядно: CMD/BAT - Расширение 32-битной арифметики
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:30, 30-04-2011 | #28


Ветеран


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

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


amel27, покажите,как отредактировать скрипт поста 25 с учетом этой инфы?

Последний раз редактировалось sov44, 02-05-2011 в 23:03.


Отправлено: 16:12, 30-04-2011 | #29


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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] получить размер каталога с подкаталогами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Копирование самого позднего по дате создания каталога. SANIOK_AV Скриптовые языки администрирования Windows 2 04-12-2009 17:29
Разное - [решено] удаление каталога с подкаталогами lud Microsoft Windows 2000/XP 2 02-07-2009 15:57
CMD/BAT - [решено] Поиск каталога и копирование всего его содержимого desk Скриптовые языки администрирования Windows 4 01-07-2009 14:28
Интерфейс - [решено] цвет шрифта каталога tref2me Microsoft Windows 2000/XP 4 07-06-2008 07:43
[решено] Идентификация каталога c помощью shell programmist72 Общий по Linux 14 13-11-2006 10:06




 
Переход