Board logo

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

作者: hakd    时间: 2015-6-10 17:43     标题: 【已解决】求一批处理,统计扩展名出现次数最多

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

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

  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
复制代码

作者: CrLf    时间: 2015-6-10 18:35

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>
复制代码

作者: CrLf    时间: 2015-6-10 19:48

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

回复 2# pcl_test


    有漏洞,不能判断是否以 %n% 结束
作者: bailong360    时间: 2015-6-10 20:07

  1. @echo off
  2. for %%a in (*) do set /a #%%~xa+=1
  3. set #|sort -r -n -k 2 -t =
  4. pause
复制代码
linux sort
作者: hakd    时间: 2015-6-11 01:34

回复 2# pcl_test

我想知道如何分别拿到扩展名变量和数量,我以后可能要用到这个变量?
作者: pcl_test    时间: 2015-6-11 09:48

回复 4# CrLf

结束?何意,请指正
作者: hakd    时间: 2015-6-11 10:53

回复 7# pcl_test


    我想知道如何分别拿到扩展名变量和数量,我以后可能要用到这个变量?
作者: pcl_test    时间: 2015-6-11 11:11

回复 9# hakd

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

作者: hakd    时间: 2015-6-11 11:16

回复 10# pcl_test


    非常感谢您。同时也非常感谢其它热心人的帮助。
作者: apang    时间: 2015-6-11 11:27

回复 7# pcl_test


    CrLf兄台的意思是,比如最大数n=21,find会把扩展名个数为2的条目也列出来
作者: apang    时间: 2015-6-11 11:28

  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
复制代码

作者: xxpinqz    时间: 2015-6-11 11:46

  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%,这写法应该没漏洞吧。。。
作者: apang    时间: 2015-6-11 12:55

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

假设n最大值是21,find "=%n%" 能取到扩展名个数为21或211的行。但211不可能出现,因为21最大。
作者: CrLf    时间: 2015-6-11 14:56

回复 7# pcl_test


    哦,没有,忘了这已经是最大值了,请忽略4楼的话
作者: CrLf    时间: 2015-6-11 15:45

借助第三方来一个
  1. dir /a-d /b | sed.exe "/\./!s/.*//;s/.*\././" | sort | uniq -c |sort /r
复制代码





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