找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 70823|回复: 15

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

[复制链接]
发表于 2015-6-10 17:43:37 | 显示全部楼层 |阅读模式
本帖最后由 hakd 于 2015-6-11 11:16 编辑

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

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2015-6-10 18:34:19 | 显示全部楼层
  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
复制代码
发表于 2015-6-10 18:35:16 | 显示全部楼层
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技术 +1 收起 理由
tigerpower + 1 powershell one-liner

查看全部评分

发表于 2015-6-10 19:48:27 | 显示全部楼层
本帖最后由 CrLf 于 2015-6-11 15:28 编辑

回复 2# pcl_test


    有漏洞,不能判断是否以 %n% 结束
发表于 2015-6-10 20:07:05 | 显示全部楼层
  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技术 +1 收起 理由
tigerpower + 1 linux

查看全部评分

 楼主| 发表于 2015-6-11 01:34:46 | 显示全部楼层
回复 2# pcl_test

我想知道如何分别拿到扩展名变量和数量,我以后可能要用到这个变量?
发表于 2015-6-11 09:48:56 | 显示全部楼层
回复 4# CrLf

结束?何意,请指正

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 是我混乱了

查看全部评分

 楼主| 发表于 2015-6-11 10:53:48 | 显示全部楼层
回复 7# pcl_test


    我想知道如何分别拿到扩展名变量和数量,我以后可能要用到这个变量?
发表于 2015-6-11 11:11:37 | 显示全部楼层
回复 9# hakd

套进for里提取
  1. for /f "tokens=1,2 delims=#=" %%a in ('set #^|find "=%n%"') do echo,%%a %%b
复制代码
 楼主| 发表于 2015-6-11 11:16:34 | 显示全部楼层
回复 10# pcl_test


    非常感谢您。同时也非常感谢其它热心人的帮助。
发表于 2015-6-11 11:27:08 | 显示全部楼层
回复 7# pcl_test


    CrLf兄台的意思是,比如最大数n=21,find会把扩展名个数为2的条目也列出来
发表于 2015-6-11 11:28:47 | 显示全部楼层
  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
复制代码
发表于 2015-6-11 11:46:29 | 显示全部楼层

  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%,这写法应该没漏洞吧。。。
发表于 2015-6-11 12:55:36 | 显示全部楼层
12#我搞错了,二楼 pcl_test 是正确的,抱歉!

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

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 确实没错,感谢指正

查看全部评分

发表于 2015-6-11 14:56:24 | 显示全部楼层
回复 7# pcl_test


    哦,没有,忘了这已经是最大值了,请忽略4楼的话
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 01:17 , Processed in 0.024249 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表