2009-04-17 2 views
4

Hallo Leute nur fragen, ob u mir dieses Skript zu ändern, helfen kann, die mit dem Spielen um ive, ich kann es nicht Wildcard charcters zu akzeptieren bekommen ‚*‘Batch-Datei anzeigen Directory Size

@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 

Seine in einem Batch Datei mit dem Namen DirSize und ist wie so

dirsize c:\folder 

ich es überprüfen will, Ordnergrößen für mich genannt, diesen hier ist ein Beispiel, die Cache in Firefox

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

Gibt den Wert 0

Aber wenn ich

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

Es funktioniert und ich erhalte den Wert 55322 zurück .. Helfen Sie mir bitte? Vielen Dank im Voraus freundliche Leute

+0

die erste Zeile macht Bedenken Sie: @IF NICHT DEFINIERT _ECHO ECHO OFF dann können Sie _ECHO gesetzt, wenn das Debuggen. –

+0

Danke, das hat bei mir funktioniert! –

Antwort

0

Sie müssten, was Sie derzeit in einem anderen for Schleife, die die * in eine Reihe von Verzeichnissen erweitert haben.

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 

könnte (ungetestet, obwohl, aber sollten Sie die allgemeine Idee geben) arbeiten

0

Wenn Sie eine Windows-Version von grep haben (Sie ein bei GNU utilities for Win32 finden) Sie tun können so etwas wie dieses:

dir /s %1 | grep --after-context=1 "Total Files Listed:" 
4

Powershell macht dies einfach, natürlich:

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

Und PowerShell ist bereits auf Windows 7 installiert. Steigen Sie auf den Zug auf! :-)

Außerdem ist C:\users\%USERNAME%\AppData\ keine zuverlässige Methode, AppData zu finden. Versuchen Sie %APPDATA% (oder $env:APPDATA in PowerShell).

3

Ok für einen Starter, lassen Sie uns sagen Wildcards werden nicht gut in Batch-Dateien und speziell in für Loops unterstützt.
Das ist, was ich kam mit:

DirSize.cmd "gültigen Pfad"

@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 

___Usage___
Argument: ein Weg sein muss (keine Datei) das enthalten Wildcards oder nicht.Pfad muss oben gültig sein, wenn dir eingeben Pfad

___Notes___
Dieses Skript für alle Dateien überprüft und Unterverzeichnisse, auch versteckte/System diejenigen. /a Argument die dir ändern und h-s (wie/ad-h-s) hinzufügen, um dieses Verhalten zu entfernen.

Ich überarbeitet das Argument Überprüfung nach meinem Geschmack jetzt, so denke ich, dass es verwendbar ist.

Ich hoffe, das hilft.

+0

Das funktioniert perfekt für mich! Ich habe oben hinzugefügt ...; if [% 1] == [] goto: Usage & exit/b 0 if [% 1] == [/?] Goto: Usage & exit/b 0 ... und dann an der Unterseite hat die Verwendung und Anmerkungen in der Nutzungs Funktion mehrerer Echos mit der Endung/b 0 Vielen Dank! – AnneTheAgile

+0

Ich bin froh, dass das wieder helfen kann. Code Wiederverwendung, umso besser :) – Jay

0

Dieser Code wird bis zu 2.000.000 TB Verzeichnisgröße Grenze zu erhöhen und reale Größe angezeigt werden, was nützlich wäre, wenn der Ordner zu viele Dateien enthält.

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

10x schneller als durch FOR. Mit dem Vorteil der

@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 

Ergebnis Ausgabebeispiel jeder der erlaubten Parameter des DIR-Befehl (in diesem Fall/S) zu verwenden, in der Lage: (im Beispiel nahm die Routine 3 Sekunden wird die Berechnung Größe der C: \ WINDOWS mit einer Größe von 28GB)

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