批处理 - 特定文件夹的文件大小(以 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 为单位)的脚本的主要内容,如果未能解决你的问题,请参考以下文章

批处理文件返回文件夹大小并删除内容(如果大于50gb)

android 获取文件夹文件的大小 以BKBMBGB 为单位

根据文件大小自动判断单位B,KB,MB,GB

Android 获取文件大小

文件大小单位的换算不清楚: 字节、KB、MB、GB、TB、PB、EB的单位换算

java 文件上传 大小_java 上传文件大小转换为 GB/MB/KB/B