Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] получить размер каталога с подкаталогами (http://forum.oszone.net/showthread.php?t=158404)

Loki3D 27-11-2009 15:15 1281276

получить размер каталога с подкаталогами
 
подскажите, возможно ли это и как?

Petya V4sechkin 27-11-2009 15:24 1281288

Команда Diruse (Diruse Examples).
Файл Diruse.exe можно взять из установочного CD \Support\Tools\suptools.msi (support.cab).

gora 27-11-2009 15:34 1281300

Код:

@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 27-11-2009 15:54 1281328

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

Petya V4sechkin, Большое спасибо за подсказку.

Oceanel 05-11-2010 16:36 1535481

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


XFNeo 02-02-2011 16:32 1602910

Цитата:

Цитата Oceanel
Echo Размер папки = !dirsize! »

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

gora 03-02-2011 13:20 1603501

Цитата:

Цитата XFNeo
как сделать что бы размер показывался в кб\мб\гб »

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


XFNeo 03-02-2011 14:15 1603549

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

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)  )

Нужны комментарии ко всем командам.
Заранее благодарен

gora 03-02-2011 15:58 1603625

Цитата:

Цитата XFNeo
Нужны комментарии ко всем командам. »

Начнем со строки
Код:

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 при обработке последней строки вывода.

sov44 01-04-2011 10:32 1648656

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


@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


sov44 01-04-2011 13:57 1648847

Не знаю, как посчитать сумму удаляемых файлов в корзинах. С остальным вроде бы разобрался, но как то коряво получилось.

sov44 01-04-2011 21:20 1649078

помогите с циклом
Код:

@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


gora 01-04-2011 21:50 1649097

Код:

@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


gora 01-04-2011 22:54 1649137

Цитата:

Цитата sov44
почему при запуске скрипта определения размера файла появляется ошибка: отсутствующий операнд »

Не находит файла (одного или обоих) по указанному пути.

sov44 01-04-2011 23:21 1649148

С условием поиска не получается. Не могу прикрутить 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%


gora 01-04-2011 23:37 1649154

sov44, не удаляйте посты! Мой пост 14 выглядит как-то глупо, не находите?
Цитата:

Цитата sov44
Опять сложный для меня цикл. »

Не в цикле дело, просто у Вас путь или имя файла написаны неправильно, я Оперу не использую и не могу проверить Ваши пути. Вот тест и он работает, с путями разберитесь самостоятельно.
Код:

@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 01-04-2011 23:47 1649158

Цитата:

Цитата gora
sov44, не удаляйте посты! Мой пост 14 выглядит как-то глупо, не находите? »

Прошу прощения. Учту на будущее.
Цитата:

Цитата gora
у Вас путь или имя файла написаны неправильно »

Путь прописан правильно. Делаю скрипт по удалению мусора. Забыл написать, что сначала считается размер файла, потом файл удаляется. При повторном запуске скрипта ( файла уже нет) вполне логично выскакивает ошибка. Нужен цикл, чтобы сначала проверил наличие файла. Если он есть, то показать его размер и удалить его, если нет, то переходить дальше по скрипту.
Код:

@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


Iska 02-04-2011 00:55 1649182

Цитата:

Цитата sov44
Нужен цикл, чтобы сначала проверил наличие файла. »

Зачем цикл? Просто проверяйте, как уже у Вас есть ниже. Для получения размера можно вместо перебора «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 ==========================================================================


sov44 03-04-2011 12:14 1649934

Сейчас делаю проверку по условию наличия программы. Если есть программа, то считается размер кеша и чистит его, если нет, то ничего не считает и выводит сообщение с прочерками. Столкнулся с непонятным:
При установленной Опере если
Код:

%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


gora 03-04-2011 13:08 1649971

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
со следующей строкой в одну, это разные строки.

Iska 04-04-2011 07:51 1650514

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

Цитата 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».

sov44 04-04-2011 09:05 1650543

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

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

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

sov44 07-04-2011 15:17 1653073

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


gora 07-04-2011 16:21 1653116

Цитата:

Цитата sov44
1 какой смысл прибавления к dirsize нуля и дальнейшего сравнения %dirsizeT%" и %dirsize%? 2 Какие есть ограничения по размеру обработки командного файла? »

1 Проверка числа, на "не превышение" максимально допустимого значения.
2 Максимальное значение число для арифметики в CMD = 2^31 - 1 (2147483647)

sov44 27-04-2011 20:57 1666848

Снова нужна помощь по скрипту
Код:

@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:39 1667432

Цитата:

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


gora 29-04-2011 11:14 1667438

Цитата:

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

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

amel27 30-04-2011 09:30 1667883

Цитата:

Цитата gora
другого варианта счета в CMD таких больших чисел я не знаю »

поразрядно: CMD/BAT - Расширение 32-битной арифметики

sov44 30-04-2011 16:12 1668063

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

amel27 03-05-2011 12:01 1669448

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. подсвеченную строку отредактировал, т.к. не понял её смысл в оригинале

sov44 03-05-2011 13:04 1669478

Цитата:

Цитата amel27
не совсем понимаю, зачем нужна такая точность, по мне так вполне хватило бы обычного округления до Mb »

Согласен, Вы правы.
Цитата:

Цитата amel27
подсвеченную строку отредактировал, т.к. не понял её смысл в оригинале »

Списал где-то этот кусок. Обьяснить не могу. Пологаю, что для более полной очистки корзины. :)

FiFallcon 03-05-2011 19:32 1669718

В одном из первых постов gora пишет про то что нужно включить кодировку.... Как это сделать? Оо

sov44 03-05-2011 20:29 1669744

FiFallcon, попробуй в Notepad: файл - сохранить как - кодировка:866
или строка в тексте скрипта: chcp 866

Iska 03-05-2011 20:38 1669747

Цитата:

Цитата sov44
FiFallcon, попробуй в Notepad: файл - сохранить как - кодировка:866 »

У Вас какой notepad.exe?

sov44 03-05-2011 22:36 1669805

Цитата:

Цитата Iska
У Вас какой notepad.exe? »

упс... Ошибочка вышла. :blush2: Не Notepad а AkelPad (v. 4.5.5 в Total Commander)

amel27, при повторном запуске скрипта (пост 30) выскакивает ошибка.

Iska 03-05-2011 23:47 1669842

sov44, Вы ж не первый день здесь: какая именно ошибка (точное сообщение), на какой команде…

sov44 04-05-2011 00:47 1669861

Цитата:

Цитата Iska
какая именно ошибка (точное сообщение), на какой команде… »

Ошибка - отсутствующий операнд при запуске скрипта с пустой корзиной. Скрин во вложении.

amel27 04-05-2011 02:01 1669890

Цитата:

Цитата sov44
отсутствующий операнд при запуске скрипта с пустой корзиной »

исправил

sov44 04-05-2011 23:15 1670380

Хочу прикрутить к скрипту (пост 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. Нужна подсказка.

amel27 05-05-2011 03:53 1670455

Цитата:

Цитата sov44
куда приткнуть m3 »

не понятен смысл этой задумки

sov44 05-05-2011 07:21 1670481

Цитата:

Цитата amel27
не понятен смысл этой задумки »

amel27, скрипт отлично работает с жесткими дисками. Мелкая и совсем не обязательная хотелка, которая если будет решена - хорошо, не будет решена - ничего страшного.
читать дальше »
При вставленной обычной флешке пишет, что файл не найден. Скрины Image 1.jpg, Image 2.jpg при подключенном коммуникаторе, 2011-05-05 09 02 33.jpg при обычной флешке.

amel27 05-05-2011 14:04 1670669

sov44, ошибка была при наличии пустых папок - исправил

по поводу скринов 1-2 была тема:
CMD/BAT - [решено] Составление списка существуюих дисков + отсев дисков не имеющих ФС

так будет выглядеть начало скрипта со сканированием через WMIC:
читать дальше »
Код:

@Echo Off
SetLocal EnableDelayedExpansion

rem Очистка корзины на всех дисках
Set Cnt=0& Set dirsize4=0& For /F "UseBackQ" %%d In (
`WMIC LogicalDisk Where "FileSystem LIKE '_%%'" Get Caption^|Find ":"`) 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
))


sov44 21-05-2011 13:10 1680070

amel27, нужна помощь в правке скрипта (финальный кусок). Какая-то ошибка, вместо размера в 0,3 Мб, отражается размер 3000,0 Мб. Не могу разобраться в математике.
читать дальше »
Код:

@Echo Off
  SetLocal enabledelayedexpansion

Set Cnt=10

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

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

скрипт

amel27 21-05-2011 13:32 1680082

sov44, что-то не так с примером - для 10 байт (CNT=10) никогда не будет 0,3 Mb

Foreigner 21-05-2011 13:52 1680094

sov44,
Можно с помощью du, мне кажется короче:
Код:

@echo off
setlocal
1>nul chcp 1251

du -q "C:\Folder" | findstr "Size:"

Или завернуть:
Код:

@echo off
1>nul chcp 1251
setlocal enabledelayedexpansion

for /f "tokens=2*" %%i in (' du -q "c:\folder" ^| findstr "Size:" ') do call:set %%i %%j

echo %size%
goto:eof

:set
for %%i in (%*) do set "size=!size!%%i"
set "size=%size:bytes=%"


sov44 21-05-2011 14:45 1680127

amel27, как я уже написал, это кусок скрипта, в котором cnt накопительная байтов от очистки временных файлов. Значение 10 взято условно. :)
Прошу проверить только математику.

amel27 21-05-2011 15:37 1680153

sov44, не уверен, что проблема только в "математике", для проверки мне нужно воспроизвести у себя ошибку, т.е. нужно знать версию Windows и состояние всех переменных окружения перед входом в блок, для чего достаточно вставить команду вывода значений переменных в файл:
Код:

SET>set.log
P.S. способ получения полного лога: http://forum.oszone.net/post-1675364-18.html

sov44 22-05-2011 16:06 1680622

amel27, операционная система Windows XP SP3, полный лог и сам батник во вложении.

amel27 22-05-2011 16:54 1680646

Цитата:

Цитата sov44
лог и сам батник во вложении »

в логе не вижу ошибок (проверил на калькуляторе):
Код:

  437460    байт CNT до чистки корзины
  -----------
C: +1736      байт (20906795008 свободно)
D: +3837330463 байт ( 8705867776 свободно)
E: +255        байт ( 3313324032 свободно)
  -----------
  3837769914 байт
  3659,98    Мб
  3,57      Gb


sov44 22-05-2011 20:16 1680724

amel27, батник запускался на компьютере родственников. ( за 150 км от постоянного места дислокации :) ) Лог писался там-же. Вернулся домой, этот-же батник, в такой-же винде работает правильно. Косяк не скрипта, сорри. :blush2:

sov44 09-10-2011 17:54 1769502

Немного изменил батник, чтобы путём перебора заданных папок считал размер и удалял содержимое ЭТИХ папок. В итоге скрипт удаляет сами папки и рядом лежащие. Подскажите, где ошибка?
Код:

SetLocal enabledelayedexpansion

call :OperaDel cache
call :OperaDel temporary_downloads
pause

:OperaDel
Set DirProg=%USERPROFILE%\Local Settings\Application Data\Opera\opera\%1

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  %Cnt%


sov44 17-10-2011 19:59 1775548

Столько дней без ответа!!!! Профи, не игнорируйте новичков!!!

sov44 08-11-2011 12:53 1790889

Нужна помощь в отладке скрипта получения размера содержимого папки Temp, за исключением определённых файлов и папки.
Код:

@Echo Off
SetLocal enabledelayedexpansion

Set DirProg=%WinDir%\TEMP
For /f %%I In ('dir/b/od "%DirProg%"') Do (
          if not "%%~nxI"=="kls1EE8.tmp" (
          if not "%%~nxI"=="kls1444444EE8.tmp" (
          if not "%%~nxI"=="VBE" (
        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 /A Cnt +=%dirsize%
        )))
)
Echo %Cnt%
pause


Iska 08-11-2011 15:34 1791019

Цитата:

Цитата sov44
Нужна помощь в отладке скрипта получения размера содержимого папки Temp, за исключением определённых файлов и папки. »

И в чём она (помощь) должна состоять?

gora 08-11-2011 15:36 1791021

Цитата:

Цитата sov44
получения размера содержимого папки Temp, за исключением определённых файлов и папки. »

Код:

@Echo Off
SetLocal enabledelayedexpansion
Set DirProg=%WinDir%\TEMP

Call :_DirSize "%DirProg%"
Set /A AllSize +=dirsize
Echo %AllSize%
Call :_DirSize "%DirProg%\VBE"
Set /A AllSize -=dirsize
Echo %AllSize%
For %%i In ("%DirProg%\kls1EE8.tmp" "%DirProg%\kls1444444EE8.tmp") Do If Exist %%i Set /A AllSize -= %%~zi
Echo %AllSize%
Pause>nul

:_DirSize
Set dirsize=0
For /F "skip=4 tokens=1-3" %%a IN ('Dir "%~1" /-C /S /A:-D  2^>nul') Do (
        If !flag!==1 Set dirsize=%%c
        If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
)

GoTo :EOF


sov44 28-11-2011 11:30 1804790

Нужна помощь в выявлении конфликта между двумя блоками в bat. Каждый блок по отдельности работает как надо, однако при их объединении второй блок не срабатывает.
Не обработка второго блока происходит в случае принудительного завершения процесса winword.exe первым блоком.
читать дальше »

Код:

@Echo Off
SetLocal enabledelayedexpansion
 
set iSumT=0
 
set "dr=%USERPROFILE%\Recent"& call :Calc "%dr%" lnk
set "dr=%USERPROFILE%\Application Data\Microsoft\Office\Последние файлы"& call :Calc "%dr%" lnk
set "dr=%USERPROFILE%\Local Settings\Temporary Internet Files\Content.MSO"& call :Calc "%dr%" *
set "dr=%USERPROFILE%\Local Settings\Temporary Internet Files\Content.Word"& call :Calc "%dr%" *
Set /A Cnt +=%iSumT%
goto :x1
 
:Calc
for /f "delims=*" %%i in ('dir /b/a-d "%dr%\*.%2" 2^>nul') do (
set "bg=%%i"
if "!bg:~0,1!"=="~" (
    >"%temp%\MsgBox.vbs" echo WScript.Quit^(MsgBox^(WScript.Arguments^(1^) ^& vbCrLf ^& WScript.Arguments^(2^) ^& vbCrLf ^& vbCrLf ^& WScript.Arguments^(3^), vbYesNo+vbDefaultButton1,WScript.Arguments^(0^)^)^)
    tasklist 2>nul|find /i "winword.exe" 1>nul 2>nul && (WScript "%temp%\MsgBox.vbs" "Внимание" "    Для успешной работы скрипта" "закройте все документы Word" "            Документы закрыты?")
    tasklist 2>nul|find /i "winword.exe" 1>nul 2>nul && (WScript "%temp%\MsgBox.vbs" "Внимание" "                          Документы Word не закрыты^!" "После нажатия на кнопку они будут закрыты принудительно" "                                        Продолжить?"& taskkill /F /IM winword.exe 1>nul 2>nul)
        )
    del /q "%temp%\MsgBox.vbs" 2>nul
    if exist "%dr%\!bg!" (             
        for %%a in ("%dr%\!bg!" ) do (
                set /a iSumT += %%~za
                del /f/q %%a 2>nul
                ))
    )
exit /b 0
 
rem -------------------------------------------------------------------------
 
:x1
set dirsize4=0
For /F "UseBackQ" %%d In (
`WMIC LogicalDisk Where "FileSystem LIKE '_%%'" Get Caption^|Find ":"`) 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)
 )
  )
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 Cnt=%Cnt%
echo dirsize4=%dirsize4%
Set /A Cnt +=dirsize4
 
echo  summ_Cnt=%Cnt%
pause


sov44 28-11-2011 21:54 1805236

Ни у кого нет идей, почему не запускается WMIC во втором блоке при принудительном завершении процесса winword.exe? :durak:

El Sanchez 29-11-2011 16:14 1805749

Цитата:

Цитата sov44
Ни у кого нет идей, почему не запускается WMIC во втором блоке при принудительном завершении процесса winword.exe »

sov44, частый вызов tasklist в цикле вешает WMI

sov44 29-11-2011 19:43 1805884

Цитата:

Цитата El Sanchez
частый вызов tasklist в цикле вешает WMI »

Вытащил tasklist из цикла, всё равно второй блок не запускается. :(
читать дальше »

Код:

@Echo Off
SetLocal enabledelayedexpansion
 
set iSumT=0

  >"%temp%\MsgBox.vbs" echo WScript.Quit^(MsgBox^(WScript.Arguments^(1^) ^& vbCrLf ^& WScript.Arguments^(2^) ^& vbCrLf ^& vbCrLf ^& WScript.Arguments^(3^), vbYesNo+vbDefaultButton1,WScript.Arguments^(0^)^)^)
    tasklist 2>nul|find /i "winword.exe" 1>nul 2>nul && (WScript "%temp%\MsgBox.vbs" "Внимание" "    Для успешной работы скрипта закройте все документы Word" "После нажатия на кнопку они будут закрыты принудительно" "                                        Продолжить?"& taskkill /F /IM winword.exe 1>nul 2>nul)
    del /q "%temp%\MsgBox.vbs" 2>nul
 
set "dr=%USERPROFILE%\Recent"& call :Calc "%dr%" lnk
set "dr=%USERPROFILE%\Application Data\Microsoft\Office\Последние файлы"& call :Calc "%dr%" lnk
set "dr=%USERPROFILE%\Local Settings\Temporary Internet Files\Content.MSO"& call :Calc "%dr%" *
set "dr=%USERPROFILE%\Local Settings\Temporary Internet Files\Content.Word"& call :Calc "%dr%" *
Set /A Cnt +=%iSumT%
goto :x1
 
:Calc
for /f "delims=*" %%i in ('dir /b/a-d "%dr%\*.%2" 2^>nul') do (
set "bg=%%i"
for %%a in ("%dr%\!bg!" ) do (
        set /a iSumT += %%~za
        Echo %%a
del /f/q %%a 2>nul
      )
)
exit /b 0
 
rem -------------------------------------------------------------------------
 
:x1
set dirsize4=0
ping 127.0.0.1 -n 5 >nul
For /F "UseBackQ" %%d In (`wmic LogicalDisk Where "FileSystem LIKE '_%%'" Get Caption^|Find ":"`) 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)
      )
  )
)
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 Cnt=%Cnt%
echo dirsize4=%dirsize4%
Set /A Cnt +=dirsize4
echo  summ_Cnt=%Cnt%
pause


El Sanchez 30-11-2011 14:51 1806472

sov44, да уж, не ожидал. Похоже чудит find/findstr при использовании оператора piping (|). Уберите красное:
Код:

tasklist 2>nul|find /i "winword.exe" 1>nul 2>nul

sov44 30-11-2011 16:04 1806536

Цитата:

Цитата El Sanchez
Уберите красное: »

El Sanchez, убрал, скрипт заработал :clapping:
Вот только как убрать вывод вывод в консоль путей временных файлов. Если не ошибаюсь, именно эти ошибки и убирала 2>nul
В консоли кроме размеров удаляемых файлов ничего не должно быть.

El Sanchez 30-11-2011 17:20 1806627

Цитата:

Цитата sov44
Если не ошибаюсь, именно эти ошибки и убирала 2>nul »

Ошибаетесь.
Цитата:

Цитата sov44
Вот только как убрать вывод вывод в консоль путей временных файлов »

В процедуре Calc убрать Echo %%a.

sov44 30-11-2011 18:31 1806690

Цитата:

Цитата El Sanchez
В процедуре Calc убрать Echo %%a. »

сорри, недоглядел :)
El Sanchez, ещё раз спасибо, проблема решена!

vitaliy.kornienko.35@fb 03-08-2013 02:04 2195506

Оптимизированный метод на несколько порядков быстрее работает, особенно при большом количестве файлов!!!
set DIR="c:\windows"
...

dir %DIR% /-C /S /A:-D > %TEMP%\csm_fs.tmp
type %TEMP%\csm_fs.tmp | find /V /C "" > %TEMP%\csm_fsn.tmp
set /p {file_size}num=<%TEMP%\csm_fsn.tmp
if "%{files_size}num%"=="2" goto end
set /a {file_size}num-=2
for /f "tokens=1-3" %%i in ('type %TEMP%\csm_fs.tmp ^| more +%{file_size}num%') do set SIZE=%%k& goto end

...
:end
del /q %TEMP%\csm_fs.tmp
del /q %TEMP%\csm_fsn.tmp
exit /B

---
Собственно результ в SIZE.
А принцип работы - "обрезания" строк в файле до нужной. И разбор этой строки сразу.

Actavia 12-12-2014 15:14 2443171

Здравствуйте!
Понимаю, что тема старая, но, возможно, вы сможете подсказать, как быть в ситуации, когда суммарный размер файлов превышает 4ГБ? В байтах он его определяет корректно, а вот перевод в Кб, Мб и ГБ корректно не отрабатывает (видимо, т.к. числа близки к пределу CMD или же ручки кривые). Как можно решить эту проблему?
Большое спасибо!


Время: 07:53.

Время: 07:53.
© OSzone.net 2001-