Размер каталога
Добрый день, форумчане, помогите пожалуйста со скриптом! Есть скрипт (так же с форума :)), который подсчитывает размер определенной папки:
PHP код:
@Echo Off
chcp 1251
SetLocal enabledelayedexpansion
Set DirProg=F:PROB4_razmer directoriitemp
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
Pause>nul
Помогите пожалуйста сделать условие: Если каталог имеет размер больше 1мб, то вызывается vbs скрипт, иначе просто закрытие!
Пробовал писать нечто подобное (If "dirsize" GEQ 1048576 START /WAIT CScript... else), но чет я не силен в шеле... (
Заранее Спасибо!
|
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
|
Iska, спасибо большое! Выручили! :)
|
Iska, а не подскажешь, как сделать так, чтобы он каждый файл в директории сравнивал на размер, и если находит такой, то как обычно Спасибо!
|
alemaxona, пожалуйста, ещё раз и уже по-русски.
|
Спасибо! Уже решил! Как обычно, мой язык вперед ленивых рук лезет... Спасибо за отклик!
|
Что-то арифметика не правильно считает размер скрытых папок, подскажите, где ошибка?
Код:
@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
|
Здесь:
Код:
C:\>set /a 2147483646 + 1
2147483647
C:\>set /a 2147483647 + 1
-2147483648
Числа слишком велики для арифметики командного процессора.
|
Немного запутался. Подскажите, как найти в директории Windows папки типа $NtUninstall?????????? и определить их размер а потом удалить их?
|
ferget, мне интересней понять cmd.
|
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
Кстати, под приведённую Вами маску попадают не все потребные папки.
|
Iska, расчёт и удаление скрытых папок - это дополнение одного большого скрипта в cmd.
За WSH спасибо, положу в копилку :)
п.с. подскажите аналог в WSH, VBS
|
sov44, некорректным меткам в пакетном файле аналога в WSH нет ;).
|
Цитата:
Цитата Iska
некорректным меткам в пакетном файле аналога в WSH нет »
|
имелось ввиду не метка, а комментарий (или как там его.. :))
Как насчёт варианта решения задачи пост 9 ?
|
sov44, комментарии в пакетном файле оформляются единственным способом — при помощи команды Rem.
На WSH сие выглядит следующим образом: VBScript — Rem Statement; JScript — Comment Statements (Windows Scripting - JScript).
Цитата:
Цитата sov44
Как насчёт варианта решения задачи пост 9 ? »
|
Свой вариант я озвучил выше.
Язык — всего лишь инструмент. Какой окажется наиболее приемлем для решения задачи — тот и берётся.
|
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 »
|
Согласен, но "Привычка - вторая натура" :(
|
Цитата:
Цитата gora
Согласен, но "Привычка - вторая натура" »
|
Угу. Даже, вон Colorer научили отображать «::» как комментарий, хотя это и неправильно.
|
Цитата:
Цитата Iska
Даже, вон Colorer научили отображать «::» как комментарий »
|
Это не я, это коллега AZJIO, хотя мне это нравится, т.к., я использовал «::», пусть и неправильно, но умышленно, как комментарий.
|
Необходимо исключить из расчёта динамический файл 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
|
Цитата:
Цитата sov44
Необходимо исключить из расчёта динамический файл »
|
В этом цикле имена не выводятся командой Dir и "исключить" таким способом не получится.
Будет проще сосчитать размер всей папки и вычесть из него размер этого(этих) файла(файлов). Размер файлов можно определить любым известным способом.
Например:
Код:
For /R "%windir%\Prefetch" %%a In (CMD.EXE-*.pf) Do Echo %%~za
|
Есть две переменные содержащие вычисляемые размеры объектов. Размеры могут превышать 2 ГБ.
Нужно их перевести в МБ с точностью до сотых и поместить в новые переменные.
Пример:
num1=4000000000
num2=6000000000
num1MB=3814,69
num2MB=5722,04
|
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.
© OSzone.net 2001-