Board logo

标题: [其他] [已解决] 批处理如何统计指定文件下图片文件的数量和有标记的图片的数量? [打印本页]

作者: 228630386    时间: 2015-3-25 15:00     标题: [已解决] 批处理如何统计指定文件下图片文件的数量和有标记的图片的数量?

  1. @echo off
  2. set n=0
  3. set m=0
  4. for /f "delims=" %%a in ('dir /s /a-d /b *.jpg') do (
  5. set /a n+=1
  6. more "%%a" | find "rdf:Bag" >nul && set /a m+=1
  7. )
  8. set /a t=%n%-%m%
  9. echo 该目录下共有%n%张JPG图片,其中%m%张有标记,%t%张无标记>"共有%n%张JPG图片,其中%m%张有标记,%t%张无标记.txt"
  10. exit
复制代码
以上代码只能执行同一个目录下的有一个子文件夹下有好几个文件夹的批处理。

可否实现一个文件夹中有多个子文件夹,下面多很多很多个子文件夹都能通用的呢?需要改哪一个的代码?
作者: CrLf    时间: 2015-3-25 16:23

这句列举子目录下所有含标记的 jpg 文件,其他看着改吧
  1. @findstr /s /m "rdf:Bag" *.jpg
复制代码

作者: 228630386    时间: 2015-3-25 16:35

回复 2# CrLf


    亲,能再详细一点么? 只改哪一句不行喔,还要改哪里呢? 因为是新手,求指教。
作者: CrLf    时间: 2015-3-25 16:45

  1. @echo off
  2. for /f "delims=" %%a in ('findstr /s /m "rdf:Bag" *.jpg') do set /a 含标记+=1
  3. for /f "delims=" %%a in ('dir /s *.jpg') do set /a 总数+=1
  4. set /a 无标记=总数-含标记
  5. echo 该目录下共有%总数%张JPG图片,其中%含标记%张有标记,%无标记%张无标记>"共有%总数%张JPG图片,其中%含标记%张有标记,%无标记%张无标记.txt"
复制代码

作者: 228630386    时间: 2015-3-25 16:54

回复 4# CrLf


    亲,我测试了好几个文件夹,但数量都不一致,还有标记和没标记的数量都是错的。
作者: CrLf    时间: 2015-3-25 17:16

回复 5# 228630386


    举个栗子?
作者: 228630386    时间: 2015-3-25 17:28

回复 6# CrLf


文件中JPG总数是123张,有标记是78张,无标记是45张。

但得出来的结果是"共有148张JPG图片,其中78张有标记,70张无标记",只有有标记这一项是对的。
作者: CrLf    时间: 2015-3-25 17:44

本帖最后由 CrLf 于 2015-3-25 17:56 编辑

那就这样,会慢点就是了
  1. @echo off
  2. for /f "delims=" %%a in ('findstr /s /m "rdf:Bag" *.jpg') do set /a 含标记+=1
  3. for /f "delims=" %%a in ('findstr /s /m . *.jpg') do set /a 总数+=1
  4. set /a 无标记=总数-含标记
  5. echo 该目录下共有%总数%张JPG图片,其中%含标记%张有标记,%无标记%张无标记>"共有%总数%张JPG图片,其中%含标记%张有标记,%无标记%张无标记.txt"
复制代码

作者: 228630386    时间: 2015-3-25 17:48

回复 8# CrLf


共有201张JPG图片,其中78张有标记,123张无标记

得出的结果也是有问题,结果变成了总张数为无标记了,有标记也是没有错,应该再改一下就可以了,我也看到有点混乱了。
作者: 228630386    时间: 2015-3-25 17:50

回复 9# 228630386


    是否少了一个搜索总张数的命令?
作者: CrLf    时间: 2015-3-25 17:56

回复 10# 228630386


    哦,逻辑有漏洞,已修改
作者: 228630386    时间: 2015-3-25 18:51

回复 11# CrLf

我测试好多几个大的文件夹,有些三个数都对得上。但有些只有JPG对得上,标记数量还是有问题,不知是图片标记问题还是其它原因,我们通常都是用中文或者英文去标记的,有些结果还是有出入。
正确:  共有459张JPG图片,其中84张有标记,375张无标记
命令:  共有459张JPG图片,其中91张有标记,368张无标记

有些出入会更大,文件夹中只有1张标记,但结果显示有251张。难道是图片的标记有问题?
作者: 228630386    时间: 2015-3-25 19:16

回复 11# CrLf


    希望能可以做到100%准确,因为在Windows自带都可以做到,命令应该也可以吧? 但可能有难度吧。
   我检查了一下明明没有标记的图片,但又有记录在标记的数量上,也没什么特殊的。
作者: pcl_test    时间: 2015-3-25 19:50

回复 13# 228630386
你看看这样列出的有标记的图片跟实际是否对得上?对不上的打包共享网盘发出来看看
  1. @echo off
  2. (for /f "delims=" %%a in ('findstr /s /m "rdf:Bag" *.jpg') do set /a 含标记+=1 & echo %%a
  3. for /f "delims=" %%b in ('findstr /s /m . *.jpg') do set /a 总数+=1
  4. set /a 无标记=总数-含标记
  5. echo 该目录下共有%总数%张JPG图片,其中%含标记%张有标记,%无标记%张无标记)>统计信息.txt
复制代码

作者: 228630386    时间: 2015-3-25 20:18

回复 14# pcl_test


    链接: http://pan.baidu.com/s/1jG3R6mi 密码: iehs
    我已经将有问题的图片上传到云盘中,图片共有57张JPG没错,但是图片一个标记也有没有,但两个命令都统计出了相同的标记数量,是图片的问题吗?
作者: pcl_test    时间: 2015-3-25 20:30

回复 15# 228630386
嗯,是图片问题,19张的标记为空格,而系统把空格也当成没有,所以看上去是没有标记,但实际是有的
作者: 228630386    时间: 2015-3-25 20:55

回复 16# pcl_test


    请问有办法解决么? 因为我们通常都是用中文来标记的,但有些图片他来身自带空格,如果这也记录上,对我们统计数据带来不便。
作者: pcl_test    时间: 2015-3-25 21:47

回复 17# 228630386
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. set m=0
  5. for /f "delims=" %%a in ('dir /a-d /s /b *.jpg') do (
  6. set /a n+=1
  7. set str=
  8. for /f "delims=" %%b in ('findstr "rdf:Bag" "%%a"') do set str=%%b
  9. set str=!str: =!
  10. if "!str:~-8,-1!" == "rdf:Bag" set /a m+=1
  11. )
  12. set /a t=%n%-%m%
  13. echo 该目录下共有%n%张JPG图片,其中%m%张有标记,%t%张无标记
  14. pause
复制代码

作者: 228630386    时间: 2015-3-25 22:30

回复 18# pcl_test


    非常感谢,我明天回到公司再测试一下,辛苦两位大侠!!!
作者: CrLf    时间: 2015-3-26 00:12

来一个系统原生的办法
  1. 1>1/* :
  2. @echo off
  3. for /f "delims=" %%a in ('dir /a-d /b /s *.jpg ^| cscript -nologo -e:jscript "%~0"') do (
  4. echo %%a>"%%a.txt"
  5. )
  6. pause & exit /b
  7. */
  8. var filelist = WScript.StdIn.ReadAll().split(/\r?\n/)
  9. var fso = new ActiveXObject('Scripting.FileSystemObject')
  10. var shell = new ActiveXObject('Shell.Application')
  11. var FLAG=0,NOFLAG=0
  12. for(var i in filelist){
  13. var fullpath = fso.GetFile(filelist[i]).Path
  14. var namespace = shell.Namespace(fullpath.replace(/[^\\]*$/,''))
  15. var parsename = namespace.ParseName(fullpath.replace(/.*\\/,''))
  16. var value = namespace.GetDetailsOf(parsename,namespace.GetDetailsOf('',18)==='标记'?18:5)
  17. if(/\S/.test(value)){FLAG++}else{NOFLAG++}
  18. }
  19. WSH.Echo('该目录下共有'+(FLAG+NOFLAG)+'张JPG图片,其中'+FLAG+'张有标记,'+NOFLAG+'张无标记')
复制代码

作者: 228630386    时间: 2015-3-26 15:42

回复 20# CrLf


    但为什么有时候会弹出错误信息? exit,不能自动关闭窗口?
作者: CrLf    时间: 2015-3-26 16:02

回复 21# 228630386


    你改过代码了吧,我第 20 行没出现过 exit
作者: 228630386    时间: 2015-3-26 16:05

回复 18# pcl_test


    http://pan.baidu.com/s/1kT67xVh
    亲,代码又遇到另一个问题,明明有标记,又被记录成没有标记了,这是有问题的图片。
作者: 228630386    时间: 2015-3-26 16:08

回复 22# CrLf


    是喔,哪什么情况下可以自动关闭窗口呢? exit不可以的么?
作者: pcl_test    时间: 2015-3-26 16:22

回复 24# 228630386
回复 23# 228630386
使用CrLf  20楼的代码,你要运行完退出,只要改第6行代码为exit即可,即去掉pause &
作者: 228630386    时间: 2015-3-26 17:26

回复 25# pcl_test


    非常感谢,终于可以了。代码在测试中,暂时没有问题。
作者: asy666    时间: 2021-10-23 19:30

来学习一下




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