3

このスクリプトを変更したいと思います。ワイルドカード文字を受け入れることができません:

@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が返されます。

4

6 に答える 6

4

もちろん、PowerShellを使用するとこれが簡単になります。

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

そして、PowerShellはすでにWindows7にインストールされています。:-)

また、C:\users\%USERNAME%\AppData\AppDataを見つけるための信頼できる方法ではありません。試してください%APPDATA%(または$env:APPDATAPowerShellで)。

于 2009-08-17T01:36:51.720 に答える
3

手始めに、ワイルドカードがバッチファイル全体で、特にforループで十分にサポートされていないとしましょう。
それが私が思いついたものです:

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と入力するときは、パスが有効である必要があります

___Notes___
このスクリプトは、非表示/システムのものも含め、すべてのファイルとサブディレクトリをチェックします。dir / a引数を変更し、 -hs(/ ad-hsなど)を追加して、この動作を削除します。

引数チェックを自分の好みに合わせて修正したので、使えると思います。

これがお役に立てば幸いです。

于 2009-08-24T17:24:11.127 に答える
0

現在持っているものを一連のディレクトリにfor展開する別のループにラップする必要があります。*

そう

@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

動作する可能性があります(ただし、テストされていませんが、一般的なアイデアが得られるはずです)

于 2009-04-17T08:49:30.390 に答える
0

FOR を使用するよりも 10 倍高速です。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 

結果出力例: (例では、ルーチンは、サイズが 28GB の C:\WINDOWS のサイズを計算するのに 3 秒かかりました)

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
于 2015-05-19T04:35:33.670 に答える
0

このコードは、ディレクトリ サイズの制限を最大 2,000,000 TB まで増やし、より多くの実際のサイズを表示します。これは、フォルダーに含まれるファイルが多すぎる場合に役立ちます。

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
于 2014-08-16T22:12:24.833 に答える
0

の Windows バージョン( GNU utility for Win32grepで見つけることができます) をお持ちの場合は、次のようなことができます。

dir /s %1 | grep --after-context=1 "Total Files Listed:"
于 2009-04-17T10:48:52.040 に答える