[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 【已解决】求一批处理,统计扩展名出现次数最多

本帖最后由 hakd 于 2015-6-11 11:16 编辑

写一简洁的BAT,可以实现统计当前文件夹内同一文件类型(扩展名相同即可)出现最多的,并输出其扩展名以及出现的次数。这里需要考虑如果有多类扩展名搜索及出现次数都相同的情况下都输出。要求,代码简洁高效,最好有简单的注释,过程和结果最好不涉及文件输出。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off & setlocal enabledelayedexpansion
  2. set n=0
  3. for %%a in (*) do set /a #%%~xa+=1
  4. for /f "tokens=2 delims==" %%b in ('set #') do if %%b geq !n! set n=%%b
  5. set #|find "=%n%"
  6. pause
复制代码

TOP

powershell
  1. dir |group Extension|sort count -des
复制代码
bat+mshta
  1. <!-- :
  2. @echo off
  3. mshta "%~f0" | more
  4. pause & exit
  5. -->
  6. <script src=http://www.bathome.net/lib/diy/hide.js></script>
  7. <script src=http://www.bathome.net/lib/Prototype.js></script>
  8. <script src=http://www.bathome.net/lib/diy/WSH.js></script>
  9. <script src=http://www.bathome.net/lib/diy/Function.js></script>
  10. <script src=http://www.bathome.net/lib/diy/DIYprototype.js></script>
  11. <script>
  12. var map = {}
  13. dir().files()
  14. ._EACH(ret('$0.replace(/.*\\./gm,"")'))
  15. ._each(ret('map[$0]=map[$0]?map[$0]+1:1'))
  16. var arr = array(map).sort(ret('values($1)-values($0)'))
  17. echo(arr)
  18. </script>
复制代码
1

评分人数

TOP

本帖最后由 CrLf 于 2015-6-11 15:28 编辑

回复 2# pcl_test


    有漏洞,不能判断是否以 %n% 结束

TOP

  1. @echo off
  2. for %%a in (*) do set /a #%%~xa+=1
  3. set #|sort -r -n -k 2 -t =
  4. pause
复制代码
linux sort
1

评分人数

TOP

回复 2# pcl_test

我想知道如何分别拿到扩展名变量和数量,我以后可能要用到这个变量?

TOP

回复 4# CrLf

结束?何意,请指正
1

评分人数

    • CrLf: 是我混乱了技术 + 1

TOP

回复 7# pcl_test


    我想知道如何分别拿到扩展名变量和数量,我以后可能要用到这个变量?

TOP

回复 9# hakd

套进for里提取
  1. for /f "tokens=1,2 delims=#=" %%a in ('set #^|find "=%n%"') do echo,%%a %%b
复制代码

TOP

回复 10# pcl_test


    非常感谢您。同时也非常感谢其它热心人的帮助。

TOP

回复 7# pcl_test


    CrLf兄台的意思是,比如最大数n=21,find会把扩展名个数为2的条目也列出来

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. set "Max=1"
  3. for %%a in (*) do (
  4.         set /a #%%~xa+=1
  5.         if !#%%~xa! GTR !Max! set "Max=!#%%~xa!"
  6. )
  7. set #|findstr "=%Max%$"
  8. pause
复制代码

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. for %%a in (*) do set /a #%%~xa+=1&if !#%%~xa! geq !n! set "n=!#%%~xa!"
  3. for /f "delims==" %%a in ('set #^|find "=%n%"')do echo 后续引用时的变量名称写法%%a,调用统计值的写法%%%%a%%.
  4. pause
复制代码
寻找最大值,所以=%n%,这写法应该没漏洞吧。。。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

12#我搞错了,二楼 pcl_test 是正确的,抱歉!

假设n最大值是21,find "=%n%" 能取到扩展名个数为21或211的行。但211不可能出现,因为21最大。
1

评分人数

    • CrLf: 确实没错,感谢指正技术 + 1

TOP

回复 7# pcl_test


    哦,没有,忘了这已经是最大值了,请忽略4楼的话

TOP

返回列表