我是批处理脚本的新手,我想知道是否可以列出文本文件中所有类型文件的组合大小。
例如:如果有两个.mp3
个文件,每个1GB
输出应为
MP3 2147483648 bytes
我知道如何列出目录中的所有文件或只列出一种类型的文件。我遇到的问题是将类似文件类型的大小加在一起。
到目前为止,这是我的代码:
@echo off
Rem This is for listing down all the files in the directory Program files
set mypath=%cd%
dir "%mypath%" *.mp3 > %mypath%\lists.txt
echo program completed
答案 0 :(得分:2)
调整批处理代码非常简单,以便在结果中管理任意数量的数字。此解决方案允许在累积结果中管理最多16位数字:
@echo off
setlocal EnableDelayedExpansion
set "digits=8"
rem Assemble the factor with the proper number of digits
set "factor=1"
for /L %%i in (1,1,%digits%) do set "factor=!factor!0"
rem Accumulate size of all extensions in 2 groups of %digits% digits each
for %%a in (*.*) do (
set "size=%factor%%%~Za"
set /A "low[%%~Xa]+=1!size:~-%digits%!-factor, carry=low[%%~Xa]/factor, low[%%~Xa]%%=factor"
set "size=%%~Za"
set "size=!size:~0,-%digits%!"
set /A "high[%%~Xa]+=carry+size"
)
rem Show results
for /F "tokens=2,3 delims=[.]=" %%a in ('set high[') do (
if %%b neq 0 (
set "low=%factor%!low[.%%a]!"
echo %%a %%b!low:~-%digits%! bytes
) else (
echo %%a !low[.%%a]! bytes
)
)
输出示例:
C:\Users\Antonio\Documents\tests> dir *.mp3
El volumen de la unidad C no tiene etiqueta.
El número de serie del volumen es: 0895-160E
Directorio de C:\Users\Antonio\Documents\tests
07/07/2010 09:58 a. m. 14,336,418 BigFile.mp3
01/05/2018 03:01 p. m. 143,364,180 BigFile2.mp3
01/05/2018 03:13 p. m. 1,433,641,800 BigFile3.mp3
07/07/2010 09:58 a. m. 14,336,418 BigFileB.mp3
4 archivos 1,605,678,816 bytes
0 dirs 390,478,827,520 bytes libres
C:\Users\Antonio\Documents\tests> test.bat
bat 200759 bytes
csv 20412 bytes
mp3 1605678816 bytes
pdf 62799 bytes
txt 1036041 bytes
答案 1 :(得分:0)
我建议对于批量编写脚本的人来说,这个任务并不简单,并且会提供一个利用PowerShell
的解决方案。
@Echo Off
Set "MyDir=%~1"
If Defined MyDir CD /D "%MyDir%" 2>Nul || Exit /B
Dir /B/A-D >Nul 2>&1 || Exit /B
(For /F "Skip=3 Tokens=1-2 Delims=. " %%A In ('PowerShell -NoP -NoL^
"GCI -Ex 'lists.txt' -Fo|?{!$_.PSIsContainer}|Group Extension|"^
"Select Name,@{n='TS';e={(($_.Group|Measure Length -Sum).Sum)}}"
') Do Echo %%A %%B bytes)>"%__CD__%lists.txt"
有了这个,你要么:
%~1
替换为您的目标目录。或:
如果两者都没有,它应该为当前目录产生输出。
(请注意,因为输出文件会覆盖目标目录中的任何现有文件,所以它会在自己的结果中包含一个旧的大小。因此我添加了一个排除项(未经测试),作为一部分PowerShell
命令)
答案 2 :(得分:0)
只要累计尺寸不超过整数限制(2,147,483,647), 这个小批量可能会这样做:
:: Q:\Test\2018\05\01\SO_50117738.cmd
@Echo off & SetLocal
Pushd "C:\Test"
For /f "delims==" %%A in ('2^>Nul Set Ext[') Do Set "%%A="
For /f "delims=" %%A in ('Dir /B/A-D') Do Set /A "Ext[%%~xA]+=%%~zA/1024"
Set Ext[
现在输出整个kbytes(字节截断)
的示例输出> Q:\Test\2018\05\01\SO_50117738.cmd
Ext[.cmd]=0
Ext[.html]=2
Ext[.ps1]=11
Ext[.sh]=3
Ext[.txt]=3
Ext[.vbs]=0
Ext[]=0
> powershell -nop -nol "$ext=@{};ls -File|%{$ext.\"$($_.Extension)\"+=$_.Length};$ext"
Name Value
---- -----
.txt 4567
.ps1 12827
.vbs 435
.cmd 2000
.sh 4605
.html 3536
219
另一个对输出有更多控制的人
> powershell -nop -nol "$ext=@{};ls -File|%{$ext.\"$($_.Extension)\"+=$_.Length};$ext.GetEnumerator()|sort Name|%{'{0,-6} {1,12}' -f $_.Name,$_.Value}"
219
.cmd 2000
.html 3536
.ps1 12827
.sh 4605
.txt 4567
.vbs 435