Укажите общий размер всех файлов с типом в пакете - PullRequest
0 голосов
/ 01 мая 2018

Я новичок в пакетных сценариях, и я хотел знать, возможно ли перечислить общий размер всех файлов с типом в текстовом файле.

Например: если есть два .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

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Пока накопленный размер не превышает целочисленный предел (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[

Пример вывода теперь для целых килобайт (усеченных байтов)

> 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
0 голосов
/ 01 мая 2018

Очень просто настроить Batch-код для управления любым количеством цифр в результате. Это решение позволяет управлять до 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
0 голосов
/ 01 мая 2018

Я бы предположил, что эта задача не так проста для новичка в пакетном скриптинге и предложит решение, использующее вместо этого 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...