【问题标题】:Calculate Size of documents in a Directory using CMD使用 CMD 计算目录中文档的大小
【发布时间】:2018-03-29 23:12:45
【问题描述】:

我有一个目录命名文件,里面有.doc、.xlsx、.pdf、.htm等文件和其他目录。

我想使用 CMD 计算此目录中任何类型文档的大小。

例如:我需要计算 .html 文档的数量及其总大小。

Dir 命令显示文件总数及其大小。

【问题讨论】:

  • 尝试过还是只是在等待代码??

标签: file cmd count directory size


【解决方案1】:

在第一个 for 循环中获取所有可用的扩展。
使用第二个 for 循环遍历每个找到的扩展。
使用第三个(嵌套)forloop 获取文件数和累积大小:

@echo off
setlocal &REM enabledelayedexpansion
for %%a in (*) do (
  set "ext_%%~xa=*%%~xa"
)
for /f "tokens=2 delims==" %%a in ('set ext_') do (
  for /f "tokens=1,3" %%b in ('dir /-c %%a^|findstr /e "Bytes"') do echo %%a:  Files:%%b  Size: %%c
)

注意:您可能需要根据您的语言调整“tokens=1,3”和"Bytes" 字符串。在我的(德语)窗口上,dir /a-d /-c 的摘要看起来像:

          15 Datei(en),         42291 Bytes               <<< this is the needed line
           0 Verzeichnis(se), 358679015424 Bytes frei

(注意:dir /-c 删除了“千位分隔符”,在某些语言中是点 .,在其他语言中是逗号 ,

【讨论】:

  • 如何查找dir 输出的倒数第二行,这样您就不再依赖Bytes 字符串?顺便说一句,您描述的是dir /a-d /-c,但您在代码中使用了dir /-c...
  • @aschipfl 喜欢for /f "tokens=1,3" %%a in ('dir /a-d /-c * ^|findstr /bc:" "') do if not defined x set x=%%a %%becho %x%?绝对是朝着正确方向迈出的一步。仍然是一个问题:它总是标记 1 和 3 吗?
  • 不完全,这会将第一行存储到x;我在想set "x=" &amp; set "y=",然后是for /f "tokens=1,3" %%a in ('dir /a-d /-c * ^|findstr /bc:" "') do set "y=!x!" &amp; set "x=%%a %%b"echo/%y%(实际上延迟扩展需要正确切换以确保安全)。不幸的是,我也无法回答代币问题;我不认为微软可以...... ;-)
  • @aschipfl: "评论格式错误": its findstr /bc: "" 并且工作正常。你对延迟扩展是正确的。
【解决方案2】:

以下是两个例子,你应该只需要在第 2 行编辑/确认文件路径

第一个使用Dir 并尝试根据您的问题找到所需的行:

@Echo Off
Set "SrcDir=%UserProfile%\Documents"

If "%~1"=="" (Set "_=%SrcDir%\*.*") Else Set "_=%SrcDir%\*.%~1"
If Not Exist "%_%" (Echo %_%    No matches&GoTo EndIt)

Set "$="
For /F "Tokens=*" %%A In ('Dir/D/-C "%_%"^|FindStr/BC:"  "'
) Do If Not Defined $ Set "$=%_%    %%A"
Echo(%$%

:EndIt
Timeout -1

第二个使用 PowerShell,它可以让您更好地控制例如文件大小单位,(我使用的是 kB)

@Echo Off
Set "SrcDir=%UserProfile%\Documents"

If "%~1"=="" (Set "_=%SrcDir%\*.*") Else Set "_=%SrcDir%\*.%~1"
If Not Exist "%_%" (Echo %_%    No matches&GoTo EndIt)

Powershell -C "$n=(GCI '%_%'|Measure).Count;"^
 "$s=[Math]::Round((GCI '%_%'|Measure -S Length).Sum/1kB,2);"^
 "Write-Host '%_%   ' $n 'file(s) totalling' $s'kB'"

:EndIt
Timeout -1

要么:

  • 双击它 - 总计all 文件在%SrcDir%

或者:

  • 通过命令行:
    • scriptName.cmd - 总计all 文件在%SrcDir%
    • scriptName.cmd xlsx - 总计 .xlsx 文件在 %SrcDir%

注意:在59 行上,紧跟在%_% 之后的空格是单个Tab

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2020-08-02
    相关资源
    最近更新 更多