Пакетный файл для отображения размера каталога - PullRequest
4 голосов
/ 17 апреля 2009

Привет, ребята, просто интересно, можете ли вы помочь мне изменить этот скрипт, с которым я играл, я не могу заставить его принимать символы подстановки '*'

@echo off
setLocal EnableDelayedExpansion
set /a value=0
set /a sum=0
FOR /R %1 %%I IN (*) DO (
set /a value=%%~zI/1024
set /a sum=!sum!+!value!
)
@echo Size is: !sum! k

Он находится в пакетном файле с именем dirsize и называется так

dirsize c:\folder

Я хочу, чтобы он проверил размеры папок для меня, вот пример, кеш в Firefox

dirsize C:\users\%username%\AppData\Local\Mozilla\Firefox\*.default\Cache

Возвращает значение 0

Но если я пойду

dirsize C:\users\%username%\AppData\Local\Mozilla\Firefox\sr1znnb4.default\Cache

Это работает, и я возвращаю значение 55322 .. Помогите мне, пожалуйста? Заранее благодарим добрых людей

Ответы [ 6 ]

4 голосов
/ 17 августа 2009

PowerShell делает это легко, конечно:

    (gci . -Recurse | Measure-Object -Property Length -Sum).Sum

А PowerShell уже установлен на Windows 7. Приступайте к победе! : -)

Кроме того, C:\users\%USERNAME%\AppData\ не является надежным способом поиска AppData. Попробуйте %APPDATA% (или $env:APPDATA в PowerShell).

3 голосов
/ 24 августа 2009

Хорошо, для начала, допустим, подстановочные знаки плохо поддерживаются в пакетных файлах, особенно в для циклов .
Вот что я придумал:

DirSize.cmd" действительный путь "

@echo off
rem Args[1]= "Path" or "valid path with wildcard"
set _size=0
set dRaw=%~1
echo %~1|findstr "*"&& set dSource=%~dp1|| (
    set dSource=%~1\
    if not "%dRaw:~-1%"=="\" set dRaw=%dRaw%\
)
for /f "delims=" %%D in ('dir /ad /b %dRaw%') do call :DirSize "%dSource%%%~D"
set /a size=_size/1024
echo size=%size% k (%_size% bytes)
exit /b 0

:DirSize
    call :FileSize "%~1"
    for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do call :DirSize "%~1\%%~d"
    exit /b 0

:FileSize
    for /f "delims=" %%f in ('dir /a-d /b "%~1\"2^>nul') do for %%F in (%1\%%f) do set /a _size+=%%~zF
    exit /b 0

___ Использование ___
Аргумент: Должен быть путем (а не файлом), который либо содержит символы подстановки , либо нет. Путь должен быть верным при вводе dir path

___ Примечания ___
Этот скрипт проверяет все файлы и подкаталоги, даже скрытые / системные. измените аргумент dir / a и добавьте -h-s (как / ad-h-s), чтобы удалить это поведение.

Я пересмотрел проверку аргументов по своему вкусу, поэтому думаю, что она пригодна для использования.

Надеюсь, это поможет.

0 голосов
/ 19 мая 2015

в 10 раз быстрее, чем через FOR. С преимуществом возможности использовать любой из разрешенных параметров команды DIR (в данном случае / S)

@ECHO OFF

SET folder="C:\WINDOWS"

call:timer

ECHO Processing, please wait...

CALL :folderSize size %folder% "/S"


CALL :strNumDivide sizeKb %size% 1024
CALL :strNumDivide sizeMb %sizeKb% 1024
CALL :strNumDivide sizeGb %sizeMb% 1024

CALL :formatNumber size %size%
CALL :formatNumber sizeKb %sizeKb%
CALL :formatNumber sizeMb %sizeMb%
CALL :formatNumber sizeGb %sizeGb%

ECHO.
ECHO Size of %folder%: 
ECHO.

ECHO %size% bytes
ECHO %sizeKb% Kb
ECHO %sizeMb% Mb
ECHO %sizeGb% Gb
ECHO.

pause
exit /b

:: Function to calculate the size of a directory and its subdirectories
::----------------------------------------------------------------------
:folderSize <returnVariableName> <folder> [DIR parameters]
    SetLocal EnableExtensions EnableDelayedExpansion

    SET folder=%2
    SET params=%~3

    IF NOT DEFINED folder SET folder="%CD%"

    DIR %params% /W "%folder:"=%" > %TEMP%\folderSize.tmp

    FOR /F "tokens=1 delims=:" %%x IN ('findstr /n /e ":" %TEMP%\folderSize.tmp') DO (SET line=%%x)

    IF DEFINED line (

        SET /A line = !line! + 1

        FOR /F "tokens=4 delims= " %%i IN ('findstr /n "bytes" %TEMP%\folderSize.tmp^|findstr "!line!:"') DO (SET size=%%i)
        SET size=!size:.=!

    ) ELSE (

        FOR /F "tokens=3 delims= " %%i IN ('findstr /e "bytes" %TEMP%\folderSize.tmp') DO (SET size=%%i)
        SET size=!size:.=!

    )

    DEL %TEMP%\folderSize.tmp > nul

    EndLocal & SET "%~1=%size%"

GOTO:EOF



:: Extras functions to convert between different units and to give numerical format
:: --------------------------------------------------------------------------------
:strNumDivide <returnVariableName> <stringNum> <divisor>
    SetLocal EnableExtensions EnableDelayedExpansion 

    SET strNum=%~2
    SET divisor=%~3

    SET result=
    SET number=

    IF !divisor! EQU 0 GOTO:EOF

    FOR /L %%n IN (0,1,18) DO (
        IF NOT "!strNum:~%%n!" == "" (
            SET number=!number!!strNum:~%%n,1!

            IF !number! GEQ !divisor! (
                SET /A quotient=!number! / !divisor!
                SET /A number=!number! - !quotient! * !divisor!
                IF !number! EQU 0 SET number=
                SET result=!result!!quotient!
            ) ELSE (
                IF DEFINED result SET result=!result!0
            )
        )
    )

    IF NOT DEFINED result SET "result=0"
    EndLocal & SET "%~1=%result%"

GOTO:EOF


:formatNumber <returnVariableName> <number> [separator [group size]] 
    SetLocal EnableExtensions EnableDelayedExpansion 
    SET "raw=%~2"
    SET "separator=%~3" 
    SET "group=%~4" 
    SET "answer=" 
    IF NOT DEFINED raw GOTO :EOF
    IF NOT DEFINED separator SET "separator=."
    IF NOT DEFINED group SET "group=3"

    FOR %%g IN (-%group%) DO (
        FOR /F "tokens=1,2 delims=,." %%a IN ("%raw%") DO ( 
            SET int=%%a
            SET frac=%%b

            FOR /F "delims=:" %%c IN ('^(ECHO;!int!^& Echo.NEXT LINE^)^|FindStr /O "NEXT LINE"') DO (
                SET /A length=%%c-3
            ) 

            FOR %%c IN (!length!) DO ( 
                SET radix=!raw:~%%c,1!
            )

            FOR /L %%i IN (!length!, %%g, 1) DO ( 
                SET answer=!int:~%%g!!separator!!answer! 
                SET int=!int:~0,%%g!
            ) 
        ) 
    )
    SET answer=%answer: =%
    SET answer=%answer:~0,-1%

    EndLocal & SET "%~1=%answer%%radix%%frac%" 
Goto :EOF 

Пример вывода результата: (в этом примере подпрограмме потребовалось 3 секунды для вычисления размера C: \ WINDOWS размером 28 ГБ)

Processing, please wait...

Size of "C:\WINDOWS":

30.936.389.769 bytes
30.211.318 Kb
29.503 Mb
28 Gb


Elapsed Time: 3 secs
0 голосов
/ 17 августа 2014

Этот код увеличит ограничение размера каталога до 2 000 000 ТБ и отобразит более реальный размер, что будет полезно, если папка содержит слишком много файлов.

rem SET DIR=%1
SET DIR=C:\DIR1\

IF NOT EXIST "%DIR%" (
ECHO Directory "%DIR%" does not exist.
goto END
)

setlocal EnableDelayedExpansion

set GB=
set SIZE=

set exp=000000000

FOR /R "%DIR%" %%F IN (*) DO (
set /a SIZE=!SIZE!+%%~zF
if !SIZE! geq 1!exp! (
set /a GB=!GB!+!SIZE:~0,-9!
for /f "tokens=* delims=0" %%a in ("!SIZE:~-9!") do set SIZE=%%a
)
)
if not defined SIZE set SIZE=0
if not defined GB goto EOS

FOR /L %%N IN (1,1,9) DO (
if "!SIZE:~%%N!" == "" (
set SIZE=!GB!!exp:~%%N!!SIZE!
goto EOS
)
)
:EOS

call :Divide !SIZE! 1024 SIZEKB

echo Size is: !SIZE!B (!SIZEKB!kB)

endlocal

:END
pause
exit

:Divide
set Num1=%~1
set Num2=%~2
set %3=
set Num=
set Number=
IF !Num2! EQU 0 goto :EOF
FOR /L %%N IN (0,1,18) DO (
if "!Num1:~%%N!" == "" goto :EOD
set Number=!Number!!Num1:~%%N,1!
if !Number! geq !Num2! (
  set /a quotient=!Number!/!Num2!
  set /a Number=!Number!-!quotient!*!Num2!
  if !Number! equ 0 set Number=
  set Num=!Num!!quotient!
) else (
  if defined Num set Num=!Num!0
)
)
:EOD
if not defined Num set Num=0
set %3=%Num%
goto :EOF
0 голосов
/ 17 апреля 2009

Если у вас есть версия Windows grep (вы можете найти ее в утилитах GNU для Win32 ), вы можете сделать что-то вроде этого:

dir /s %1 | grep --after-context=1 "Total Files Listed:"
0 голосов
/ 17 апреля 2009

Вам нужно будет обернуть то, что у вас есть, в другой цикл for, который расширяет * в серию каталогов.

So

@echo off
setLocal EnableDelayedExpansion
set /a sum=0
for /d %%D in (%1) do (
  FOR /R %%D %%I IN (*) DO (
    set /a value=%%~zI/1024
    set /a sum=!sum!+!value!
  )
)
echo Size is: !sum! k

может работать (хотя и не проверено, но должно дать вам общее представление)

...