Войти

Показать полную графическую версию : [решено] получить размер каталога с подкаталогами


Страниц : 1 2 [3] 4

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

amel27
05-05-2011, 14:04
sov44, ошибка была при наличии пустых папок - исправил

по поводу скринов 1-2 была тема:
CMD/BAT - [решено] Составление списка существуюих дисков + отсев дисков не имеющих ФС (http://forum.oszone.net/showthread.php?t=174368)

так будет выглядеть начало скрипта со сканированием через 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
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
sov44, что-то не так с примером - для 10 байт (CNT=10) никогда не будет 0,3 Mb

Foreigner
21-05-2011, 13:52
sov44,
Можно с помощью du (http://technet.microsoft.com/ru-ru/sysinternals/bb896651), мне кажется короче:

@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
amel27, как я уже написал, это кусок скрипта, в котором cnt накопительная байтов от очистки временных файлов. Значение 10 взято условно. :)
Прошу проверить только математику.

amel27
21-05-2011, 15:37
sov44, не уверен, что проблема только в "математике", для проверки мне нужно воспроизвести у себя ошибку, т.е. нужно знать версию Windows и состояние всех переменных окружения перед входом в блок, для чего достаточно вставить команду вывода значений переменных в файл:SET>set.log

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

sov44
22-05-2011, 16:06
amel27, операционная система Windows XP SP3, полный лог и сам батник во вложении.

amel27
22-05-2011, 16:54
лог и сам батник во вложении »в логе не вижу ошибок (проверил на калькуляторе):
437460 байт CNT до чистки корзины
-----------
C: +1736 байт (20906795008 свободно)
D: +3837330463 байт ( 8705867776 свободно)
E: +255 байт ( 3313324032 свободно)
-----------
3837769914 байт
3659,98 Мб
3,57 Gb

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

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

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
Столько дней без ответа!!!! Профи, не игнорируйте новичков!!!

sov44
08-11-2011, 12:53
Нужна помощь в отладке скрипта получения размера содержимого папки 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
Нужна помощь в отладке скрипта получения размера содержимого папки Temp, за исключением определённых файлов и папки. »
И в чём она (помощь) должна состоять?

gora
08-11-2011, 15:36
получения размера содержимого папки 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
Нужна помощь в выявлении конфликта между двумя блоками в 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
Ни у кого нет идей, почему не запускается WMIC во втором блоке при принудительном завершении процесса winword.exe? :durak:

El Sanchez
29-11-2011, 16:14
Ни у кого нет идей, почему не запускается WMIC во втором блоке при принудительном завершении процесса winword.exe »

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

sov44
29-11-2011, 19:43
частый вызов 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
sov44, да уж, не ожидал. Похоже чудит find/findstr при использовании оператора piping (|). Уберите красное:

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




© OSzone.net 2001-2012