Показать полную графическую версию : [решено] получить размер каталога с подкаталогами
подскажите, возможно ли это и как?
Petya V4sechkin
27-11-2009, 15:24
Команда Diruse (Diruse Examples (http://technet.microsoft.com/en-us/library/cc786699(WS.10).aspx)).
Файл Diruse.exe (http://forum.oszone.net/attachment.php?attachmentid=13494&d=1216215198) можно взять из установочного CD \Support\Tools\suptools.msi (support.cab).
@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) обязательна.
gora, Вариант хороший, но не мой случай, у меня задан набор каталогов, но способ оригинальный :)
Petya V4sechkin, Большое спасибо за подсказку.
gora, Большое спасибо. Немного добавил и получил еще и кол-во файлов:
@Echo Off
SetLocal enabledelayedexpansion
Set DirProg=c:\musor
For /F "skip=4 tokens=1-3" %%a IN ('Dir "%DirProg%" /-C /S /A:-D^|find /I "файлов"') Do (
If !flag!==1 Set dirsize=%%c
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
set filecnt=%%a
)
Echo Размер папки = !dirsize!
Echo Количество файлов = !filecnt!
Pause>nul
Echo Размер папки = !dirsize! »
Обьясните плиз, как сделать что бы размер показывался в кб\мб\гб
как сделать что бы размер показывался в кб\мб\гб »
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
Если кому не сложно помогите разобраться в этом коде
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) )
Нужны комментарии ко всем командам.
Заранее благодарен
Нужны комментарии ко всем командам. »
Начнем со строки 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 пропускаем первые 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 при обработке последней строки вывода.
Есть скрипт для удаления временных файлов. Подскажите, как его дополнить, чтобы получить общую сумму удалённых файлов, в мегабайтах до десятых.
@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
Не знаю, как посчитать сумму удаляемых файлов в корзинах. С остальным вроде бы разобрался, но как то коряво получилось.
помогите с циклом
@Echo Off
SetLocal enabledelayedexpansion
rem очистка корзины
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 ') Do (
If !flag!==1 Set dirsize=%%c
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
)
Set kb=1024 Set /a mb=kb*kb, dirsizeMB=dirsize/mb, ostMB=dirsize%%mb*100/mb
echo Очистка корзины - OK %dirsizeMB%,%ostMB% Мб
pause
@Echo Off
SetLocal enabledelayedexpansion
rem очистка корзины
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 dirsize=%%c
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
)
Set /A Allsize +=dirsize
)
)
Set kb=1024
Set /a mb=kb*kb, AllsizeMB=Allsize/mb, ostMB=Allsize%%mb*100/mb
echo Очистка корзины - OK %AllsizeMB%,%ostMB% Мб
Pause
почему при запуске скрипта определения размера файла появляется ошибка: отсутствующий операнд »
Не находит файла (одного или обоих) по указанному пути.
С условием поиска не получается. Не могу прикрутить if exist. Опять сложный для меня цикл.
@Echo Off
SetLocal enabledelayedexpansion
set /A Cnt =0
for %%I in ("%AppData%\Opera\Opera\typed_history.xml") do set dirsize2=%%~zI
for %%I in ("%AppData%\Opera\Opera\global_history.dat") do set dirsize3=%%~zI
Set /A Cnt +=%dirsize2%
Set /A Cnt +=%dirsize3%
echo %Cnt%
sov44, не удаляйте посты! Мой пост 14 выглядит как-то глупо, не находите?
Опять сложный для меня цикл. »
Не в цикле дело, просто у Вас путь или имя файла написаны неправильно, я Оперу не использую и не могу проверить Ваши пути. Вот тест и он работает, с путями разберитесь самостоятельно.
@Echo Off
for %%I in ("%Windir%\notepad.exe") do set dirsize2=%%~zI
Echo %dirsize2%
for %%I in ("%Windir%\regedit.exe") do set dirsize3=%%~zI
Echo %dirsize3%
Set /A Cnt +=dirsize2
Set /A Cnt +=dirsize3
echo %Cnt%
Pause
sov44, не удаляйте посты! Мой пост 14 выглядит как-то глупо, не находите? »
Прошу прощения. Учту на будущее.
у Вас путь или имя файла написаны неправильно »
Путь прописан правильно. Делаю скрипт по удалению мусора. Забыл написать, что сначала считается размер файла, потом файл удаляется. При повторном запуске скрипта ( файла уже нет) вполне логично выскакивает ошибка. Нужен цикл, чтобы сначала проверил наличие файла. Если он есть, то показать его размер и удалить его, если нет, то переходить дальше по скрипту.
@Echo Off
SetLocal enabledelayedexpansion
set /A Cnt =0
for %%I in ("%AppData%\Opera\Opera\typed_history.xml") do set dirsize2=%%~zI
for %%I in ("%AppData%\Opera\Opera\global_history.dat") do set dirsize3=%%~zI
Set /A Cnt +=%dirsize2%
Set /A Cnt +=%dirsize3%
echo %Cnt%
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
pause
Нужен цикл, чтобы сначала проверил наличие файла. »
Зачем цикл? Просто проверяйте, как уже у Вас есть ниже. Для получения размера можно вместо перебора «for» использовать «call», тем паче, что повторяемые действия следует выносить в процедуры:
@echo off
setlocal enableextensions enabledelayedexpansion
set /a iSum = 0
call :CalcAndDel "%AppData%\Opera\Opera\typed_history.xml"
call :CalcAndDel "%AppData%\Opera\Opera\global_history.dat"
echo Total size: %iSum%
endlocal
exit /b 0
rem ==========================================================================
rem ==========================================================================
:CalcAndDel
set sFile=%~1
if defined sFile (
if exist "%sFile%" (
set /a iSum += %~z1
echo del /f /q "%sFile%"
) else (
echo Not found file [%sFile%]
)
) else (
echo Error call procedure: need argument ^<file^>
)
exit /b 0
rem ==========================================================================
Сейчас делаю проверку по условию наличия программы. Если есть программа, то считается размер кеша и чистит его, если нет, то ничего не считает и выводит сообщение с прочерками. Столкнулся с непонятным:
При установленной Опере если %programfiles%\Opera без кавычек, кеш считается нормально. Если Оперу удалить, то появляются ошибки. Если поставить кавычки, то как и нужно при удалённой Опере появляется сообщение с прочерками, однако при установленной Опере опять ошибка.
@Echo Off
SetLocal enabledelayedexpansion
Set Cnt=10
rem очистка временных файлов Opera
if exist %programfiles%\Opera (
Set DirProg=%USERPROFILE%\Local Settings\Application Data\Opera\opera\cache
For /F "skip=4 tokens=1-3" %%a IN ('Dir "%DirProg%" /-C /S ') Do (
If !flag!==1 Set dirsize1=%%c
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
)
Set /A Cnt +=%dirsize1%
PUSHD "%DirProg%"
2>Nul RD /S/Q "%DirProg%"
POPD
echo Очистка временных файлов Opera - OK %dirsize1% %Cnt%
) Else ( echo Очистка временных файлов Opera - -- )
Set kb=1024 Set /a mb=kb*kb, dirsizeMB=Cnt/mb, ostMB=Cnt%%mb*100/mb
echo.
echo.
echo Очистка выполнена, всего удалено %dirsizeMB%,%ostMB% Мб
pause
ping 127.0.0.1 -n 8 > nul
sov44
Кавычки для путей с пробелами здесь обязательны.
Переменные присваиваемые/изменяемые в блоке (скобки при проверке условия) далее в блоке нужно заключать в восклицательные знаки, а не в проценты, иначе их значение будет таким же как до входа в блок.
Оперы у меня нет, проверял на кеше IE в win7 :@Echo Off
SetLocal enabledelayedexpansion
Set Cnt=10
rem очистка временных файлов Opera
Set DirProg=c:\Users\gora\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5
if exist "%DirProg%" (
For /F "skip=4 tokens=1-3" %%a IN ('Dir "%DirProg%" /-C /S ') Do (
If !flag!==1 Set dirsize1=%%c
If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
)
Set /A Cnt +=dirsize1
PUSHD "%DirProg%"
rem 2>Nul RD /S/Q "%DirProg%"
POPD
echo Очистка временных файлов Opera - OK !dirsize1! !Cnt!
) Else (echo Очистка временных файлов Opera - -- )
Set kb=1024
Set /a mb=kb*kb, dirsizeMB=Cnt/mb, ostMB=Cnt%%mb*100/mb
echo.
echo.
echo Очистка выполнена, всего удалено %dirsizeMB%,%ostMB% Мб
pause
Не объединяйте строкуSet kb=1024 со следующей строкой в одну, это разные строки.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.