批处理 - 特定文件夹的文件大小(以 GB 为单位)的脚本
Posted
技术标签:
【中文标题】批处理 - 特定文件夹的文件大小(以 GB 为单位)的脚本【英文标题】:batch - Script for filesize in GB for a specific folder 【发布时间】:2021-09-08 08:35:18 【问题描述】:我正在尝试制作一个批处理脚本,以 GB 为单位计算特定文件夹的文件大小。该文件夹可以超过 2GB。我试过这个:
@echo off
set size=0
for /r %%x in (folder directory\*) do set /a size+=%%~zx
echo %size% GigaBytes
pause
但这总是返回零并且限制为 2GiB。
然后我尝试了这个:
@For /F "tokens=*" %%a IN ('"dir %1 /s /-c | find "bytes" | find /v "free""') do @Set summaryout=%%a
@For /f "tokens=1,2 delims=)" %%a in ("%summaryout%") do @set filesout=%%a&set sizeout=%%b
@Set sizeout=%sizeout:bytes=%
@Set sizeout=%sizeout: =%
@Echo Size is :%sizeout%
pause
但我不知道如何定义目录以及如何设置 GB 为单位。
PowerShell 也不是一个选项,因为它必须在没有它的 W2k 系统上运行。
【问题讨论】:
for /r %%x in (folder directory\*) do
应为 for /R "folder directory" %%x in (*) do
。要克服 2 GiB 的限制,您必须借用另一种语言(例如 javascript、vbscript)……
@aschipfl 可以,但如何将其转换为 GB?
好吧,如果你说的是 SI 前缀 Giga,意思是 1000 * 1000 * 1000,你可以删除文件大小的最后 9 位小数,导致 GB 值向下舍入 (如果您提前检查删除的 9 个数字,您可以进行不同类型的舍入);如果你说的是二进制前缀 Gibi,意思是 1024 * 1024 * 1024,那么批处理几乎不可能......
Windows 2000 在 10 多年前就已终止支持。甚至没有安全更新。 cloudblogs.microsoft.com/windowsserver/2010/01/14/…
【参考方案1】:
这可以在一点 vbscript 的帮助下完成!
@echo off
Title Script For Getting Folder Sizes
echo Getting folder sizes for you...
setlocal disabledelayedexpansion
Set "VBS=%Temp%\ConvertSize.vbs"
set "folder=%~1"
if not defined folder set "folder=%cd%"
@for /d %%a in ("%folder%\*") do (
set "size=0"
@for /f "tokens=3,5" %%b in (
'dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:" "'
) do (
if "%%~c"=="" set "size=%%~b"
)
setlocal enabledelayedexpansion
call :ConvertBytes !size! unit
echo(%%~nxa ==^> !unit!
endlocal
)
endlocal
pause
exit /b
::-------------------------------------------------------
:ConvertBytes <Size> <Unit>
(
echo wscript.echo Convert("%~1"^)
echo 'Function to format a number into typical size scales
echo Function Convert(iSize^)
echo aLabel = Array("bytes", "KB", "MB", "GB", "TB"^)
echo For i = 0 to 4
echo If iSize ^> 1024 Then
echo iSize = iSize / 1024
echo Else
echo Exit For
echo End If
echo Next
echo Convert = Round(iSize,2^) ^& " " ^& aLabel(i^)
echo End Function
)>"%VBS%"
for /f "delims=" %%a in ('Cscript //NoLogo "%VBS%"') do ( set "%2=%%a" )
Exit /b
::-------------------------------------------------------
【讨论】:
【参考方案2】:我尝试使用嵌入式 mshta.exe
实用程序简化 WSH 的使用。所以我得到了这个代码:
set "folder=C:\\Folder directory"
@for /f "usebackq " %%a in (`mshta "javascript:var size=new ActiveXObject('Scripting.FileSystemObject').GetFolder('%folder%').Size ; new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(size/1073741824);close()"`) do @echo %%a
附:文件夹路径变量必须有双斜杠(或反斜杠)。 1GB 大小等于1073741824
字节。
附言该实用程序已在 W2K SP4 中。
【讨论】:
以上是关于批处理 - 特定文件夹的文件大小(以 GB 为单位)的脚本的主要内容,如果未能解决你的问题,请参考以下文章
android 获取文件夹文件的大小 以BKBMBGB 为单位