Board logo

标题: [文件操作] [已解决]批处理怎么查询全盘内的mp3文件呢?详情内询。 [打印本页]

作者: 慕夜蓝化    时间: 2014-12-10 18:45     标题: [已解决]批处理怎么查询全盘内的mp3文件呢?详情内询。

本帖最后由 慕夜蓝化 于 2014-12-27 10:27 编辑

之前写的使用dir查询全盘内的文件代码
如下:
code1
  1. @echo off
  2. set "num=0"
  3. set "str=c d e f g h i j k l m n o p q r s t u v w x y z"
  4. for %%i in (%str%) do (
  5.         if exist %%i: for /f "delims=" %%a in ('dir /s/b/l/aa-s-h-r/on %%i:\*mp3') do (
  6.     set /a num=num+1
  7.     )
  8. )
  9. echo 全盘mp3总数量为:%num%
  10. pause
复制代码
>_< 可是这个真的很慢 .
然后就想 因为 for /r 比较快嘛
那就用for /r 来代替dir吧
于是:
code2
  1. @echo off
  2. set "n=0"
  3. set "dri=c d e f g h i j k l m n o p q r s t u v w x y z"
  4. for %%i in (%dri%) do (
  5.     if exist %%i: for /r %%i: %%a in (*mp3) do (
  6.         set /a n=n+1
  7.     )
  8. )
  9. echo  全盘mp3总数量为:%n%
  10. pause
复制代码
= =
窗口一闪就没了。。。

然后改:
code3
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "n=0"
  4. set "dri=c d e f g h i j k l m n o p q r s t u v w x y z"
  5. for %%i in (%dri%) do (
  6.     set "sri=%%i:"
  7.     if exist !sri! for /r !sri! %%a in (*mp3) do (
  8.         set /a n=n+1
  9.         echo %%~xa
  10.     )
  11. )
  12. echo !n!
  13. pause
复制代码
echo %%~xa 检验是否通过
、 还是不行啊 .
然后就找问题,组合代码的都分开来,用echo 来显示是否通过。
最后发现问题 出在了 for /r 那里
便截取for /r 那段代码单独实验
= =可以用啊。。。
加上变量也能用啊
  1. @echo off
  2. set "n=0"
  3. set "dri=d:"
  4. for /r %dri% %%i in (*mp3) do set /a n+=1
  5. echo %n%
  6. pause
复制代码
。。。
到这时候 已经考虑到了 是不是 for /r 后面的 !sri! 出了问题
然后 干脆拿掉 !sri!
好了= =
最起码找到了问题
最后 又把 !sri! 替换为指定的盘符。
结果也如实根据卷的多少以及当前卷下文件的数量显示了相应的数字。
现在只想快些知道,到底哪里出现了问题,为什么for /r 后面的变量没有被引用?
应该怎么改呢?
还有第二段代码又出现了什么问题?
求解!拜托了。
作者: DAIC    时间: 2014-12-10 21:05

本帖最后由 DAIC 于 2014-12-11 20:21 编辑
  1. @echo off
  2. set "n=0"
  3. set "dri=c d e f g h i j k l m n o p q r s t u v w x y z"
  4. for %%i in (%dri%) do (
  5.     if exist %%i: (
  6.         pushd %%i:\
  7.         for /r %%a in (*.mp3) do (
  8.             set /a n+=1
  9.         )
  10.         popd
  11.     )
  12. )
  13. echo 全盘mp3总数量为:%n%
  14. pause
复制代码

作者: CYUYAN09    时间: 2014-12-10 21:43

@echo off
setlocal enabledelayedexpansion
set "n=0"
set dri=D
for %%i in (%dri%) do (
        if exist %%i: for /r D: %%a in (*.mp3) do (
                echo %%a
                set /a n+=1
        )
)
echo  全盘mp3总数量为:%n%
pause
这个就能过滤出来。但是换成%%i就不行了。我感觉是语法问题,这个正在查找中....
作者: apang    时间: 2014-12-10 21:58

本帖最后由 apang 于 2014-12-10 22:03 编辑

可以考虑用临时文件方案,大概也许差不多会快一点
  1. @echo off
  2. set "dri=c d e f g h i j k l m n o p q r s t u v w x y z"
  3. (for %%i in (%dri%) do (
  4.         if exist %%i:\ dir /a-d /b /s %%i:\*.mp3
  5. ))>$
  6. for /f %%a in ('find /c /v ""^<$') do set "n=%%a"
  7. echo 全盘mp3总数量为:%n%
  8. pause
复制代码

作者: CYUYAN09    时间: 2014-12-11 09:41

回复 2# DAIC


   您好,没看懂你的 pushd作用是什么啊?能解释一下吗?
作者: DAIC    时间: 2014-12-11 10:24

回复 5# CYUYAN09


可以先查看一下帮助信息:
pushd /?
作者: 慕夜蓝化    时间: 2014-12-11 10:39

回复 2# DAIC


    窗口一闪就没了 = =
不过,通过这个想法,我改了一下,那就是通过pushd 或者 cd /d 跳转的办法 。
不需要在for /r 后面添加任何驱动器号或者路径。
code
@echo off
set "n=0"
set "dri=c d e f g h i j k l m n o p q r s t u v w x y z"
for %%i in (%dri%) do (
    if exist %%i: pushd %%i:
        for /r %%a in (*mp3) do (
    set n+=1
    echo %%a >>mp3flie.txt
   )
)
echo 全盘mp3总数为:%n%
pause
相比较于dir好了不止一点半点。而且硬盘全程无杂音,很好用。
只不过,因为无法设置查询的文件属性,导致列出的文件比dir多了不少。
作者: 慕夜蓝化    时间: 2014-12-11 10:55

回复 4# apang


    嗯嗯,真的很棒,看了一下代码,果然很厉害
我曾经使用dir /s/b/l/aa-s-h-r/on d:\*mp3|find /v /c "" 来获得当前路径下的mp3文件数量,
但一直不知道该怎么应用在for语句中使其作用于其他盘符并显示总文件数量。
这样一来就可以解决问题啦
而且使用起来也特别流畅。~~~(>_<)~~~ 赞赞赞!!!
作者: 慕夜蓝化    时间: 2014-12-11 10:58

回复 3# CYUYAN09

恩,就是这样,虽然通过其他方案可以解决问题,但总是解决不了这个为什么无法运行的话,就像个疙瘩一样- -
希望早些弄明白是怎么回事。
作者: CYUYAN09    时间: 2014-12-11 19:35

回复 2# DAIC


    您好,您这个好像运行不了啊
作者: DAIC    时间: 2014-12-11 20:21

回复 10# CYUYAN09


    代码已经更新,你再试试。
作者: shelluserwlb    时间: 2014-12-11 22:33

本帖最后由 shelluserwlb 于 2014-12-11 23:01 编辑

全盘查找mp3文件。 查找完成后生成mp3文件清单。
  1. @echo off
  2. set "n=0"
  3. set "dri=c d e f g h i j k l m n o p q r s t u v w x y z"
  4. if exist mp3flie.txt del mp3flie.txt
  5. echo 正在查找mp3文件,请稍候...
  6. for %%i in (%dri%) do (
  7.     if exist %%i: call :1 %%i
  8. )
  9. echo 全盘mp3总数量为:%n%
  10. pause
  11. goto :eof
  12. :1
  13. for /r %1: %%a in ("*.mp3") do (
  14.     set /a n+=1
  15.     echo %%a >>mp3flie.txt
  16. )
  17. goto :eof
复制代码

作者: DAIC    时间: 2014-12-12 09:16

回复 12# shelluserwlb

优化第一步:
  1. @echo off
  2. set "n=0"
  3. set "dri=c d e f g h i j k l m n o p q r s t u v w x y z"
  4. if exist mp3flie.txt del mp3flie.txt
  5. echo 正在查找mp3文件,请稍候...
  6. for %%i in (%dri%) do (
  7.     if exist %%i: call :1 %%i
  8. )
  9. echo 全盘mp3总数量为:%n%
  10. pause
  11. goto :eof
  12. :1
  13. REM 把重定向放到for循环外面可以提高代码执行效率
  14. (for /r %1: %%a in ("*.mp3") do (
  15.     set /a n+=1
  16.     echo %%a
  17. ))>>mp3flie.txt
  18. goto :eof
复制代码
优化第二步:
  1. @echo off
  2. set "n=0"
  3. set "dri=c d e f g h i j k l m n o p q r s t u v w x y z"
  4. REM 由于在最外层for循环外面做重定向,下面这个判断可以省略
  5. REM if exist mp3flie.txt del mp3flie.txt
  6. echo 正在查找mp3文件,请稍候...
  7. REM 把重定向尽可能的往外移
  8. (for %%i in (%dri%) do (
  9.     if exist %%i: call :1 %%i
  10. ))>mp3flie.txt
  11. echo 全盘mp3总数量为:%n%
  12. pause
  13. goto :eof
  14. :1
  15. for /r %1: %%a in ("*.mp3") do (
  16.     set /a n+=1
  17.     echo %%a
  18. )
  19. goto :eof
复制代码
优化第三步:
  1. @echo off
  2. set "n=0"
  3. set "dri=c d e f g h i j k l m n o p q r s t u v w x y z"
  4. REM 由于在最外层for循环外面做重定向,下面这个判断可以省略
  5. REM if exist mp3flie.txt del mp3flie.txt
  6. echo 正在查找mp3文件,请稍候...
  7. REM 把重定向尽可能的往外移
  8. (for %%i in (%dri%) do (
  9.     if exist %%i: call :1 %%i
  10. ))>mp3flie.txt
  11. for /f %%i in ('type mp3flie.txt^|find /c /v ""') do (
  12.     set "RowNum=%%i"
  13. )
  14. echo,%RowNum%
  15. echo 全盘mp3总数量为:%RowNum%
  16. pause
  17. goto :eof
  18. :1
  19. for /r %1: %%a in ("*.mp3") do (
  20.     REM 假设总共有十万个mp3文件,那么就要做十万次计算,可以把它拿到for循环外面去
  21.     REM set /a n+=1
  22.     echo %%a
  23. )
  24. goto :eof
复制代码

作者: ygqiang    时间: 2014-12-12 12:13

回复 13# DAIC


    你的最后第3个这个优化代码。
与下面这个对比。

为啥下面的多出来1个mp3文件?
  1. @echo off
  2. set "dri=c d e f g h i j k l m n o p q r s t u v w x y z"
  3. (for %%i in (%dri%) do (
  4.         if exist %%i:\ dir /a-d /b /s %%i:\*.mp3
  5. ))>$.txt
  6. for /f %%a in ('find /c /v ""^<$.txt') do set "n=%%a"
  7. echo 全盘mp3总数量为:%n%
  8. pause
复制代码

作者: DAIC    时间: 2014-12-12 13:17

回复 14# ygqiang


    你分别打开两个txt文件,看看到底是多少个吧。
作者: apang    时间: 2014-12-12 16:43

回复 14# ygqiang


    可能是 for /r 搜索不到隐藏文件
作者: shelluserwlb    时间: 2014-12-12 18:10

本帖最后由 shelluserwlb 于 2014-12-12 18:12 编辑

回复 13# DAIC
谢谢指点,又长技巧了。
作者: 慕夜蓝化    时间: 2014-12-12 21:35

回复 13# DAIC


   管道符在for语句中也能使用,需要用转义符转义一下;
   重定向符往后放可以提高代码的执行效率 ;
   for /r 命令虽然无法查询隐藏属性文件,但是在进行大的数据量操作的时候,不会有卡顿现象出现;最深的感受就是使用dir时,硬盘吱吱的响声。
   时间对比上来说,for /r 也比dir 快了不少。
   记得在nameji大大的帖子里听他这样说过,因为for /r 是边查询 边列出,所以速度比较快,而dir 是在查询完毕后一次性将所有数据导出,数据越大,便愈力不从心。^_^




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