Компьютерный форум 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=228482)

alemaxona 22-02-2012 08:34 1864079

Размер каталога
 
Добрый день, форумчане, помогите пожалуйста со скриптом! Есть скрипт (так же с форума :)), который подсчитывает размер определенной папки:

PHP код:

@Echo Off
chcp 1251
SetLocal enabledelayedexpansion
Set DirProg
=F:PROB4_razmer directoriitemp

For /"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
Pause>nul 

Помогите пожалуйста сделать условие: Если каталог имеет размер больше 1мб, то вызывается vbs скрипт, иначе просто закрытие!
Пробовал писать нечто подобное (If "dirsize" GEQ 1048576 START /WAIT CScript... else), но чет я не силен в шеле... (
Заранее Спасибо!

Iska 22-02-2012 10:27 1864128

alemaxona, проще расширить скрипт VBScript, наподобие:
Код:

Option Explicit

Dim objFSO

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.GetFolder("c:\Temp").Size > 2^20 Then
        ' Здесь код из «старого» скрипта VBS
End If

Set objFSO = Nothing

WScript.Quit 0


alemaxona 22-02-2012 11:15 1864181

Iska, спасибо большое! Выручили! :)

alemaxona 24-02-2012 11:05 1865580

Iska, а не подскажешь, как сделать так, чтобы он каждый файл в директории сравнивал на размер, и если находит такой, то как обычно Спасибо!

Iska 24-02-2012 11:17 1865586

alemaxona, пожалуйста, ещё раз и уже по-русски.

alemaxona 24-02-2012 11:25 1865591

Спасибо! Уже решил! Как обычно, мой язык вперед ленивых рук лезет... Спасибо за отклик!

sov44 12-04-2012 22:27 1898565

Что-то арифметика не правильно считает размер скрытых папок, подскажите, где ошибка?
Код:

@Echo Off
SetLocal enabledelayedexpansion

set Cnt=10
call :CalcAndDel_3 %WINDIR%\^$NtUninstall?????????? AH
Set /A Cnt +=dirsize1
Echo %Cnt%
pause
exit /b

:CalcAndDel_3
For /F "skip=4 tokens=1-3" %%a IN ('Dir "%1" /-C /%2') Do (
If "%%b"=="папок" (Set flag=1) Else (Set flag=0)
if !flag!==1 Set dirsize1=%%c
)
exit /b


Iska 13-04-2012 00:11 1898606

Здесь:
Код:

C:\>set /a 2147483646 + 1
2147483647

C:\>set /a 2147483647 + 1
-2147483648

Числа слишком велики для арифметики командного процессора.

sov44 13-04-2012 12:16 1898791

Немного запутался. Подскажите, как найти в директории Windows папки типа $NtUninstall?????????? и определить их размер а потом удалить их?

ferget 13-04-2012 12:26 1898796

возьмите VBS

sov44 13-04-2012 12:57 1898818

ferget, мне интересней понять cmd.

Iska 13-04-2012 15:00 1898870

sov44, и напрасно: в WSH объект Folder имеет свойство «.Size»:
читать дальше »
Код:

Option Explicit

Dim objRegExp
Dim objFolder


Set objRegExp = WScript.CreateObject("VBScript.RegExp")

With objRegExp
        .IgnoreCase = True
        .Pattern = "^\$NtUninstall.+\$$"
End With

With WScript.CreateObject("Scripting.FileSystemObject")
        For Each objFolder In .GetSpecialFolder(0).SubFolders
                If objRegExp.Test(objFolder.Name) Then
                        WScript.Echo objFolder.Name, objFolder.Size
                End If
        Next
End With

Set objRegExp = Nothing

WScript.Quit 0


Кстати, под приведённую Вами маску попадают не все потребные папки.

sov44 13-04-2012 16:50 1898946

Iska, расчёт и удаление скрытых папок - это дополнение одного большого скрипта в cmd.
За WSH спасибо, положу в копилку :)
п.с. подскажите аналог
Код:

:: бла-бла
в WSH, VBS

Iska 13-04-2012 17:32 1898973

sov44, некорректным меткам в пакетном файле аналога в WSH нет ;).

sov44 13-04-2012 20:44 1899066

Цитата:

Цитата Iska
некорректным меткам в пакетном файле аналога в WSH нет »

имелось ввиду не метка, а комментарий (или как там его.. :))

Как насчёт варианта решения задачи пост 9 ?

Iska 14-04-2012 00:53 1899222

sov44, комментарии в пакетном файле оформляются единственным способом — при помощи команды Rem.

На WSH сие выглядит следующим образом: VBScript — Rem Statement; JScript — Comment Statements (Windows Scripting - JScript).

Цитата:

Цитата sov44
Как насчёт варианта решения задачи пост 9 ? »

Свой вариант я озвучил выше.

Язык — всего лишь инструмент. Какой окажется наиболее приемлем для решения задачи — тот и берётся.

gora 14-04-2012 11:33 1899390

sov44, попробуйте так:
Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: Папка для поиска
Set folder=e:\Temp 1\upd
Set Cnt=0
:: Для папок подпадающих под маску
For /F "tokens=*" %%a In ('Dir "%folder%" /ADH /B ^| FindStr "$NtUninstallKB[0-9]*"') Do Call :_sizeDir "%folder%\%%a"
:: Для папок НЕ подпадающих под маску
For %%a In ($hf_mig$ $abde_rew$) Do Call :_sizeDir "%folder%\%%a"
Pause>Nul

:_sizeDir
Set dirsize=0
For /F "skip=4 tokens=1-3" %%a IN ('Dir "%~1" /-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
/A Cnt +=dirsize
Echo "%~1"
Echo DirSize=%dirsize%        TotalSize=%Cnt%
Echo.
GoTo :EOF

Цитата:

Цитата Iska
комментарии в пакетном файле оформляются единственным способом — при помощи команды Rem »

Согласен, но "Привычка - вторая натура" :(

Iska 14-04-2012 12:58 1899435

Цитата:

Цитата gora
Согласен, но "Привычка - вторая натура" »

Угу. Даже, вон Colorer научили отображать «::» как комментарий, хотя это и неправильно.

gora 14-04-2012 13:11 1899438

Цитата:

Цитата Iska
Даже, вон Colorer научили отображать «::» как комментарий »

Это не я, это коллега AZJIO, хотя мне это нравится, т.к., я использовал «::», пусть и неправильно, но умышленно, как комментарий.

sov44 17-04-2012 14:49 1901289

Необходимо исключить из расчёта динамический файл CMD.EXE-087B4001.pf
Возникла сложность с его обозначением.
Код:

For /F "skip=4 tokens=1-3" %%a IN ('Dir "%windir%\Prefetch" /-C /S /A:-D 2^>nul') Do (
if not exist CMD.EXE*********.pf (
    If !flag!==1 Set dirsize=%%c
    If "%%b"=="файлов:" (Set flag=1) Else (Set flag=0)
))
Set /A Cnt +=dirsize


gora 17-04-2012 15:14 1901305

Цитата:

Цитата sov44
Необходимо исключить из расчёта динамический файл »

В этом цикле имена не выводятся командой Dir и "исключить" таким способом не получится.
Будет проще сосчитать размер всей папки и вычесть из него размер этого(этих) файла(файлов). Размер файлов можно определить любым известным способом.
Например:
Код:

For /R "%windir%\Prefetch" %%a In (CMD.EXE-*.pf) Do Echo %%~za

sov44 05-03-2013 21:26 2104955

Есть две переменные содержащие вычисляемые размеры объектов. Размеры могут превышать 2 ГБ.
Нужно их перевести в МБ с точностью до сотых и поместить в новые переменные.
Пример:
num1=4000000000
num2=6000000000

num1MB=3814,69
num2MB=5722,04

gora 06-03-2013 19:59 2105721

C применением скрипта, который Вы удалили из поста.
Код:

@Echo Off
SetLocal enabledelayedexpansion

set num1=4000000000
set num2=6000000000

Call :_convert %num1% num1MB
Call :_convert %num2% num2MB

echo %num1%        %num1MB% Мб
echo %num2%        %num2MB% Мб
pause
exit /b

:_convert
Set Cnt=%1
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!"
Set %2=%dirsizeMB%,%$.mb%
GoTo :EOF

: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



Время: 16:03.

Время: 16:03.
© OSzone.net 2001-