标题: [文件操作] 批处理怎样统计文件件里多少张图片和多少个视频和大小? [打印本页]
作者: 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编码- #&@cls&cd /d "%~dp0" & powershell -c "Get-Content '%~0' | Select-Object -Skip 1 | Out-String | Invoke-Expression" & pause&exit
- #图片格式
- $pic_ext = 'jpg png'
- #视频格式
- $video_ext = 'mp4 mkv flv'
- #遍历
- $pic_pattern = '^\.(' + $pic_ext + ')$' -replace '\s+','|'
- $video_pattern = '^\.(' + $video_ext + ')$' -replace '\s+','|'
- Get-ChildItem | Where-Object { [System.IO.Directory]::Exists($_.FullName) } | foreach {
- $size = $pic = $video = 0
- Get-ChildItem -Recurse $_ | foreach {
- $size += $_.Length
- if($_.Extension -match $pic_pattern){
- ++$pic
- } elseif($_.Extension -match $video_pattern){
- ++$video
- }
- }
- if($size -lt 1024){
- $size_str = '' + [int]$size + 'Byte'
- } elseif($size -lt 1024 * 1024){
- $size_str = '' + [int]($size / 1024) + 'KB'
- } elseif($size -lt 1024 * 1024 * 1024){
- $size_str = '' + [int]($size / 1024 / 1024) + 'MB'
- } else {
- $size_str = '' + [int]($size / 1024 / 1024 / 1024) + 'GB'
- }
- if($video -gt 0){ $str = ('_' + $video + 'v') } else { $str = '' }
- $new_name = '{0} [{1}p{2}-{3}]' -f $_.Name,$pic,$str,$size_str
- $new_name
- Invoke-Expression ('cmd /c rename "{0}" "{1}"' -f $_.FullName,$new_name)
- '--------------'
- }
复制代码
作者: 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 - #&@cls&cd /d "%~dp0" & powershell -c "Get-Content '%~0' | Select-Object -Skip 1 | Out-String | Invoke-Expression" & pause&exit
- #图片格式
- $pic_ext = 'jpg png'
- #视频格式
- $video_ext = 'mp4 mkv flv'
- #输出文件
- $file_info = 'info.txt'
- #遍历
- $pic_pattern = '^\.(' + $pic_ext + ')$' -replace '\s+','|'
- $video_pattern = '^\.(' + $video_ext + ')$' -replace '\s+','|'
- &{
- Get-ChildItem | Where-Object { [System.IO.Directory]::Exists($_.FullName) } | foreach {
- $size = $pic = $video = 0
- Get-ChildItem -Recurse -LiteralPath $_ | foreach {
- $size += $_.Length
- if($_.Extension -match $pic_pattern){
- ++$pic
- } elseif($_.Extension -match $video_pattern){
- ++$video
- }
- }
- if($size -lt 1024){
- $size_str = '' + [int]$size + 'Byte'
- } elseif($size -lt 1024 * 1024){
- $size_str = '' + [int]($size / 1024) + 'KB'
- } elseif($size -lt 1024 * 1024 * 1024){
- $size_str = '' + [int]($size / 1024 / 1024) + 'MB'
- } else {
- $size_str = '' + [int]($size / 1024 / 1024 / 1024) + 'GB'
- }
- if($video -gt 0){ $str = ('_' + $video + 'v') } else { $str = '' }
- $new_name = '{0} [{1}p{2}-{3}]' -f $_.Name,$pic,$str,$size_str
- $new_name
- Write-Host $new_name
- Invoke-Expression ('cmd /c rename "{0}" "{1}"' -f $_.FullName,$new_name)
- Write-Host '--------------'
- }
- } | 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 - #&@cls&cd /d "%~dp0" & powershell -c "Get-Content '%~0' | Select-Object -Skip 1 | Out-String | Invoke-Expression" & pause&exit
- #图片格式
- $pic_ext = 'jpg png'
- #视频格式
- $video_ext = 'mp4 mkv flv'
- #输出文件
- $file_info = 'info.txt'
- #函数 格式化显示数据
- function Fmt-Data($name,$pic,$video,$size){
- $unit = @('Byte','KB','MB','GB','TB')
- $index = 0
- $num = $size
- while($size -ge 1024){
- ++$index
- $size /= 1024
- $num = $size % 1024
- }
- $str_size = '' + [Math]::Round($num,[MidpointRounding]::AwayFromZero) + $unit[$index]
- if($video -gt 0){
- $str_video = '_' + $video + 'v'
- } else {
- $str_video = ''
- }
- return '{0} [{1}p{2}-{3}]' -f $name,$pic,$str_video,$str_size
- }
- #遍历
- $pic_pattern = '^\.(' + $pic_ext + ')$' -replace '\s+','|'
- $video_pattern = '^\.(' + $video_ext + ')$' -replace '\s+','|'
- $total_size = $total_pic = $total_video = 0
- Get-ChildItem | Where-Object { [System.IO.Directory]::Exists($_.FullName) } | foreach {
- $size = $pic = $video = 0
- Get-ChildItem -Recurse -LiteralPath $_ | foreach {
- $size += $_.Length
- if($_.Extension -match $pic_pattern){
- ++$pic
- } elseif($_.Extension -match $video_pattern){
- ++$video
- }
- }
- $total_size += $size
- $total_pic += $pic
- $total_video += $video
- $new_name = Fmt-Data -name $_.Name -pic $pic -video $video -size $size
- $new_name
- Invoke-Expression ('cmd /c rename "{0}" "{1}"' -f $_.FullName,$new_name)
- '--------------'
- }
- "`r`n--------------"
- $str = Fmt-Data -name (Get-Item .).Name -pic $total_pic -video $total_video -size $total_size
- $str
- $str | Out-File $file_info
- "--------------"
复制代码
作者: 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 |