Scripting 批处理文件以显示目录大小
我想修改这个脚本。我无法让它接受通配符字符:Scripting 批处理文件以显示目录大小,scripting,batch-file,directory,size,Scripting,Batch File,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 它位于名为dirsize的批处理文件中,如下所示: dirsize c:\folder 我想让它帮我检查文件夹
@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。您需要将当前拥有的内容包装到另一个
for
循环中,该循环将*
扩展到一系列目录中
所以
可能有效(虽然未经测试,但应该能让您大致了解情况)如果您有一个Windows版本的
grep
(您可以在上找到),您可以执行以下操作:
dir /s %1 | grep --after-context=1 "Total Files Listed:"
当然,PowerShell让这一切变得简单: (gci.-递归|度量对象-属性长度-和)。和 而且PowerShell已经安装在Windows 7上。跟上潮流!:-)
另外,
C:\users\%USERNAME%\AppData\
不是查找AppData的可靠方法。尝试%APPDATA%
(或在PowerShell中尝试$env:APPDATA
)对于初学者来说,可以说通配符在批处理文件中不受很好的支持,特别是在for循环中这就是我想到的: DirSize.cmd“有效路径” \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
参数:必须是包含通配符或不包含通配符的路径(不是文件)。键入目录路径时,路径必须有效 \uuuuuuuuuuuuuuuuuuuuuuuuuu注释
该脚本会检查所有文件和子目录,甚至是隐藏的/系统的文件和子目录。 更改dir/a参数并添加-h-s(如/ad-h-s)以删除此行为 我现在根据自己的喜好修改了参数检查,所以我认为它是可用的
我希望这会有所帮助。此代码将目录大小限制提高到2000000 TB,并将显示更真实的大小,如果文件夹包含太多文件,这将非常有用
@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
10倍以上的速度通过它为。 具有能够使用DIR命令的任何允许参数的优点(在本例中为/S)
考虑做第一行:@如果没有定义回声回声,那么你可以在调试时设置回声,这对我来说是完美的!我在上面加了。。。;如果[%1]=[]转到:使用和退出/b 0如果[%1]=[/?]转到:使用和退出/b 0…然后在底部将使用和注释放入以/b 0结尾的多个回音的使用功能中。非常感谢你!我很高兴这又能帮上忙。代码重用,更好:)这似乎确实正确地执行了文件大小总和,但在我的系统(Win10)上,我尝试了此脚本并获得以下输出:
C:\Program Files的大小:14506字节2 Kb 0 Mb 0 Gb
这显然是错误的,但当我查看该文件夹的属性时,文件资源管理器为我提供了145063491字节
,我注意到它的前5位数字与脚本显示的数字相同。显然,Windows 10上的数学有问题,这个数字表示比字节大10000x的单位。
(gci . -Recurse | Measure-Object -Property Length -Sum).Sum
@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
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
@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
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