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

[文件操作] [已解决]批处理怎么查询全盘内的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 后面的变量没有被引用?
应该怎么改呢?
还有第二段代码又出现了什么问题?
求解!拜托了。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
踏实一些点.不要着急.你想要的时间都会给你.2

本帖最后由 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
复制代码

TOP

@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就不行了。我感觉是语法问题,这个正在查找中....

TOP

本帖最后由 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
复制代码

TOP

回复 2# DAIC


   您好,没看懂你的 pushd作用是什么啊?能解释一下吗?

TOP

回复 5# CYUYAN09


可以先查看一下帮助信息:
pushd /?

TOP

回复 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多了不少。
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

回复 4# apang


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

TOP

回复 3# CYUYAN09

恩,就是这样,虽然通过其他方案可以解决问题,但总是解决不了这个为什么无法运行的话,就像个疙瘩一样- -
希望早些弄明白是怎么回事。
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

回复 2# DAIC


    您好,您这个好像运行不了啊

TOP

回复 10# CYUYAN09


    代码已经更新,你再试试。

TOP

本帖最后由 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
复制代码

TOP

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

评分人数

TOP

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

TOP

回复 14# ygqiang


    你分别打开两个txt文件,看看到底是多少个吧。

TOP

返回列表