【发布时间】:2018-03-29 23:12:45
【问题描述】:
我有一个目录命名文件,里面有.doc、.xlsx、.pdf、.htm等文件和其他目录。
我想使用 CMD 计算此目录中任何类型文档的大小。
例如:我需要计算 .html 文档的数量及其总大小。
Dir 命令显示文件总数及其大小。
【问题讨论】:
-
尝试过还是只是在等待代码??
标签: file cmd count directory size
我有一个目录命名文件,里面有.doc、.xlsx、.pdf、.htm等文件和其他目录。
我想使用 CMD 计算此目录中任何类型文档的大小。
例如:我需要计算 .html 文档的数量及其总大小。
Dir 命令显示文件总数及其大小。
【问题讨论】:
标签: file cmd count directory size
在第一个 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...
for /f "tokens=1,3" %%a in ('dir /a-d /-c * ^|findstr /bc:" "') do if not defined x set x=%%a %%b 和echo %x%?绝对是朝着正确方向迈出的一步。仍然是一个问题:它总是标记 1 和 3 吗?
x;我在想set "x=" & set "y=",然后是for /f "tokens=1,3" %%a in ('dir /a-d /-c * ^|findstr /bc:" "') do set "y=!x!" & set "x=%%a %%b" 和echo/%y%(实际上延迟扩展需要正确切换以确保安全)。不幸的是,我也无法回答代币问题;我不认为微软可以...... ;-)
s findstr /bc: "" 并且工作正常。你对延迟扩展是正确的。
以下是两个例子,你应该只需要在第 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%
注意:在5 和9 行上,紧跟在%_% 之后的空格是单个Tab
【讨论】: