Board logo

标题: [文件操作] 批处理怎样统计文件件里多少张图片和多少个视频和大小? [打印本页]

作者: asy666    时间: 2021-10-23 19:42     标题: 批处理怎样统计文件件里多少张图片和多少个视频和大小?

批量统计文件件里多少张图片和多少个视频和大小

我有很多图片文件和视频文件,每个文件夹下都有图片,但是有的文件下没有视频,有的有视频。

想实现 批量统计文件夹下的图片数量和视频数量,没有视频的不输出显示。还有总大小。

实例——
A文件夹 15张图片1个视频 (大小500MB)
B文件夹 30张图片0个视频 (大小600MB)
C文件夹 100张图片50个视频 (大小1GB)
求一个批处理命令,双击后所有文件夹一次性被处理为——

XXX(文件夹名)[15p/1V-500MB]
XXX(文件夹名)[30p-500MB]
XXX(文件夹名)[100p/50V-1GB]
……………………等等 全部自动处理为以上形式
图片格式有 jpg png bmp 等常见格式
视频格式有 MP4 avi、dat、mkv、flv、vob 等等常见格式


求大佬帮忙写一个,万分感谢
作者: went    时间: 2021-10-23 21:05

test.bat
ANSI编码
  1. #&@cls&cd /d "%~dp0" & powershell -c "Get-Content '%~0' | Select-Object -Skip 1 | Out-String | Invoke-Expression" & pause&exit
  2. #图片格式
  3. $pic_ext = 'jpg png'
  4. #视频格式
  5. $video_ext = 'mp4 mkv flv'
  6. #遍历
  7. $pic_pattern = '^\.(' + $pic_ext + ')$' -replace '\s+','|'
  8. $video_pattern = '^\.(' + $video_ext + ')$' -replace '\s+','|'
  9. Get-ChildItem | Where-Object { [System.IO.Directory]::Exists($_.FullName) } | foreach {
  10.     $size = $pic = $video = 0
  11.     Get-ChildItem -Recurse $_ | foreach {
  12.         $size += $_.Length
  13.         if($_.Extension -match $pic_pattern){
  14.             ++$pic
  15.         } elseif($_.Extension -match $video_pattern){
  16.             ++$video
  17.         }
  18.     }
  19.     if($size -lt 1024){
  20.         $size_str = '' + [int]$size + 'Byte'
  21.     } elseif($size -lt 1024 * 1024){
  22.         $size_str = '' + [int]($size / 1024) + 'KB'
  23.     } elseif($size -lt 1024 * 1024 * 1024){
  24.         $size_str = '' + [int]($size / 1024 / 1024) + 'MB'
  25.     } else {
  26.         $size_str = '' + [int]($size / 1024 / 1024 / 1024) + 'GB'
  27.     }
  28.     if($video -gt 0){ $str = ('_' + $video + 'v') } else { $str = '' }
  29.     $new_name = '{0} [{1}p{2}-{3}]' -f $_.Name,$pic,$str,$size_str
  30.     $new_name
  31. Invoke-Expression ('cmd /c rename "{0}" "{1}"' -f $_.FullName,$new_name)
  32.     '--------------'
  33. }
复制代码

作者: asy666    时间: 2021-10-24 09:29

回复 2# went


    感谢大佬,就是要这个效果的。

   然后想把整个文件夹下的所有 图片和视频数量都统计出来,然后存到一个TXT里,可以实现吗?

示例

(开心)文件下 有
111文件夹(5张图 大小5MB
222文件夹  (3张图1视频 大小5MB
333文件夹 (6张图6视频 大小5MB


效果--生成一个TXT文本
开心[14P/7V-15BM或者GB]

大佬能帮忙搞一下吗, 最好是运行上一个BAT 直接可以统计出 文件夹 和 总共的大小 谢谢
作者: aloha20200628    时间: 2021-10-24 17:52

:: 输出文件格式如   目录名》xxx 图片数=p 视频数=v 总大小=zMB(或zGB)
:: 统计简报文件存储在 c:\temp\统计简报.txt
@echo off
:: 在下行楼主替换自己的各目录
set pathList="c:\lz01","d:\lz02","e:\lz03"
:: 在下两行楼主替换自己的各文件类型
set "vList=*.mp4 *.mkv *.avi *.vob"
set "pList=*.jpg *.bmp *.tif"
md "c:\temp" 2>nul
echo,set v=wscript.arguments:z=CSng(v(0))+CSng(v(1)):wscript.echo Round(z/1048576,0),Round(z/1073741824,0)>"c:\temp\_@_.vbs"
setlocal enabledelayedexpansion
(for %%d in (%pathList%) do (
   cd /d "%%~d"
   set "dataLine=目录名》%%d"
   set "nP=" &set "npAll=" &set "nV=" &set "nvAll="
   for /f "tokens=1-2 delims=个文件 " %%1 in ('dir /-c %pList% ^| findstr /r "个文件.*字节"') do (set nP=%%1 & set npAll=%%2)
   if !nP! gtr 0 (set "dataLine=!dataLine! 图片数=!nP!")
   for /f "tokens=1-2 delims=个文件 " %%1 in ('dir /-c %vList% ^| findstr /r "个文件.*字节"') do (set nV=%%1 & set nvAll=%%2)
   if !nV! gtr 0 (set "dataLine=!dataLine! 视频数=!nV!")
   if not defined npAll (set npAll=0)
   if not defined nvAll (set nvAll=0)
   for /f "delims=" %%v in ('cscript //nologo "c:\temp\_@_.vbs" !npAll! !nvAll!') do (
       for /f "tokens=1-2 delims= " %%1 in ("%%v") do (
          if %%1 leq 999 (set nAll=%%1MB) else (set nAll=%%2GB)
          set "dataLine=!dataLine! 总大小=!nAll!"
       )
   )
   echo,!dataLine!
))>"c:\temp\统计简报.txt"
del /q "c:\temp\_@_.vbs" 2>nul
endlocal &exit
作者: asy666    时间: 2021-10-24 18:19

回复 4# aloha20200628


   

提示这个 是需要改哪里才可以用吗,我是小白,啥也不懂,勿怪
作者: went    时间: 2021-10-24 18:50

回复 3# asy666
  1. #&@cls&cd /d "%~dp0" & powershell -c "Get-Content '%~0' | Select-Object -Skip 1 | Out-String | Invoke-Expression" & pause&exit
  2. #图片格式
  3. $pic_ext = 'jpg png'
  4. #视频格式
  5. $video_ext = 'mp4 mkv flv'
  6. #输出文件
  7. $file_info = 'info.txt'
  8. #遍历
  9. $pic_pattern = '^\.(' + $pic_ext + ')$' -replace '\s+','|'
  10. $video_pattern = '^\.(' + $video_ext + ')$' -replace '\s+','|'
  11. &{
  12. Get-ChildItem | Where-Object { [System.IO.Directory]::Exists($_.FullName) } | foreach {
  13. $size = $pic = $video = 0
  14. Get-ChildItem -Recurse -LiteralPath $_ | foreach {
  15. $size += $_.Length
  16. if($_.Extension -match $pic_pattern){
  17. ++$pic
  18. } elseif($_.Extension -match $video_pattern){
  19. ++$video
  20. }
  21. }
  22. if($size -lt 1024){
  23. $size_str = '' + [int]$size + 'Byte'
  24. } elseif($size -lt 1024 * 1024){
  25. $size_str = '' + [int]($size / 1024) + 'KB'
  26. } elseif($size -lt 1024 * 1024 * 1024){
  27. $size_str = '' + [int]($size / 1024 / 1024) + 'MB'
  28. } else {
  29. $size_str = '' + [int]($size / 1024 / 1024 / 1024) + 'GB'
  30. }
  31. if($video -gt 0){ $str = ('_' + $video + 'v') } else { $str = '' }
  32. $new_name = '{0} [{1}p{2}-{3}]' -f $_.Name,$pic,$str,$size_str
  33. $new_name
  34. Write-Host $new_name
  35. Invoke-Expression ('cmd /c rename "{0}" "{1}"' -f $_.FullName,$new_name)
  36. Write-Host '--------------'
  37. }
  38. } | Out-File $file_info
复制代码

作者: aloha20200628    时间: 2021-10-24 19:46

楼主注意几点:
一。把你的各个目录,须全路径名,代入set pathList="c:\lz01","d:\lz02","e:\lz03" 这一行,替换这行中的假设目录。
二。把你的各个文件扩展名,视频类的替换代入 set "vList=*.mp4 *.mkv *.avi *.vob" 这一行,图片类的替换代入 set "pList=*.jpg *.bmp *.tif" 这一行。
三。你的c盘根目录如已写保护,不允许创建新目录,则更改 c:\temp 为其他盘如 d:\temp 即可。
   试试吧...
作者: aloha20200628    时间: 2021-10-24 20:22

楼主也可以把替换代入后的代码回帖出来,就一目了然了。
作者: asy666    时间: 2021-10-24 21:36

回复  asy666
went 发表于 2021-10-24 18:50



大佬。可能是我刚没表达清楚我的意思是,你之前给的代码就很好的。

我想实现的是。整个文件夹下 所有图片和数量数量 还有总大小

您刚才给的代码也很好,可以把所有 子文件夹都列在一个文件夹。这个功能可以保留,现在还缺的就是,统计整个文件夹下的图片数量和视频数量 还有大小了。

能麻烦大佬在改一下吗?不知道可不可以实现

如下图

作者: went    时间: 2021-10-24 22:16

本帖最后由 went 于 2021-10-24 22:29 编辑

回复 9# asy666
  1. #&@cls&cd /d "%~dp0" & powershell -c "Get-Content '%~0' | Select-Object -Skip 1 | Out-String | Invoke-Expression" & pause&exit
  2. #图片格式
  3. $pic_ext = 'jpg png'
  4. #视频格式
  5. $video_ext = 'mp4 mkv flv'
  6. #输出文件
  7. $file_info = 'info.txt'
  8. #函数 格式化显示数据
  9. function Fmt-Data($name,$pic,$video,$size){
  10. $unit = @('Byte','KB','MB','GB','TB')
  11. $index = 0
  12. $num = $size
  13. while($size -ge 1024){
  14. ++$index
  15. $size /= 1024
  16. $num = $size % 1024
  17. }
  18. $str_size = '' + [Math]::Round($num,[MidpointRounding]::AwayFromZero) + $unit[$index]
  19. if($video -gt 0){
  20. $str_video = '_' + $video + 'v'
  21. } else {
  22. $str_video = ''
  23. }
  24. return '{0} [{1}p{2}-{3}]' -f $name,$pic,$str_video,$str_size
  25. }
  26. #遍历
  27. $pic_pattern = '^\.(' + $pic_ext + ')$' -replace '\s+','|'
  28. $video_pattern = '^\.(' + $video_ext + ')$' -replace '\s+','|'
  29. $total_size = $total_pic = $total_video = 0
  30. Get-ChildItem | Where-Object { [System.IO.Directory]::Exists($_.FullName) } | foreach {
  31. $size = $pic = $video = 0
  32. Get-ChildItem -Recurse -LiteralPath $_ | foreach {
  33. $size += $_.Length
  34. if($_.Extension -match $pic_pattern){
  35. ++$pic
  36. } elseif($_.Extension -match $video_pattern){
  37. ++$video
  38. }
  39. }
  40. $total_size += $size
  41. $total_pic += $pic
  42. $total_video += $video
  43. $new_name = Fmt-Data -name $_.Name -pic $pic -video $video -size $size
  44. $new_name
  45. Invoke-Expression ('cmd /c rename "{0}" "{1}"' -f $_.FullName,$new_name)
  46. '--------------'
  47. }
  48. "`r`n--------------"
  49. $str = Fmt-Data -name (Get-Item .).Name -pic $total_pic -video $total_video -size $total_size
  50. $str
  51. $str | Out-File $file_info
  52. "--------------"
复制代码

作者: asy666    时间: 2021-10-25 08:41

回复 10# went


   非常感谢大佬。已经可以了。
   就是您把 子文件统计给去掉了。


我想要的效果是

(生成一个文件夹)

1111-[5p-10m]
2222-[5p_1v-10m]
2222-[5p_1v-10m]


然后 在有一个统计全部文件大数量和大小


例如


1111 [5p-10m]
2222 [5p_1v-10m]
2222 [5p_1v-10m]

================
美图(文件夹名) [10p_2v-30m]


===================


嘿嘿。这样就完美了,不过现在这样的也很满意了,省了好多时间,谢谢您




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2