[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
  以上两个代码都必须放在歌手名文件夹所在的文件夹下使用,只有这样使用,才能保证获取到且只获取到你想要的音乐文件的完整路径名,并且,为后面的for语句正确地解析这些路径字符串提供保证。

  随风的思路是:用 dir /a-d /b /s 来获取完整路径名,放到for语句中来解析完整路径字符串,用 %%~dpa. 来获取音乐文件所处的文件夹完整路径(这里使用了一个小技巧:在字符串最后添加一个点号,从而使得for语句的%%~ni把文件夹名当做文件名来处理),再用 %%~ni 获取文件夹名,也就是歌手名,把这个歌手名用下划线连接到原来的文件名前面,用ren来实现改名——%%~nxi 获取原文件完整的文件名和后缀名。

  pusofalse的思路与随风大致相同,只不过在获取音乐完整路径的时候,换用了效率更高的 for /r 语句,并用一个变量var来获取音乐文件所在文件夹的完整路径,通过判断var是否经过赋值来判断当前处理的音乐文件是否位于同一目录下,因为直接用 %%~dpa 获取到的字符串最后有一个反斜杠,所以,第二个for语句中,用 !var:~,-1! 把最后的反斜杠去掉了(在for语句内部,如果要引用已经发生了改变的变量,必须使用变量延迟功能,也就是最开始的 setlocal 语句),后面的思路和随风的一样。其实,pusofalse的代码大可不必判断当前处理的文件与上一次处理的文件是否位于同一目录下,因为 for /r 的时候,会获得文件的完整路径,只需要对完整路径直接进行操作就可以了,可以借鉴随风的做法,在 %%~dpa 的时候,直接在最后加上一个点号,可以使得效率进一步提升。

  说实话,解释代码是比较累人的,很多人宁肯写上百行代码,也不想解释其中的意思,因为往往是解释内容比代码内容还多,并且也不见得别人能领会你的意思,要想看懂别人的代码,还是需要有一点基础了才好办,楼主不仅仅想知其然,还想知其所以然,这样的想法是非常值得提倡的,不过,还是需要先潜水一段时间,多翻翻论坛老帖,特别是教学区的帖子,才会有所收获。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  在 for /f 语句中,第一个括号里的内容该如何引用,有如下规则:
  1) 若读取的是某个文件的内容,只需要填写该文件的绝对路径或相对路径即可;如 for /f %%i in (test.txt) do ……
  2) 若读取的是某个字符串,则该字符串应该用双引号把该字符串括起来,如 for /f %%i in ("bbs.bathome.net") do ……
  3) 若读取的是某条命令或者某条复合语句返回的结果,则需要用单引号把这条命令或者这条复合语句括起来,比如 for /f %%i in ('dir /a-d /b /s') do ……,又比如 for /f %%i in ('dir /a-d /b /s^|findstr /i "txt"') do ……

  第一个括号内更复杂的引用规则,在此不再深入探讨。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  解决由于多次重命名造成歌手名累加的问题,可以使用如下代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir/b/s/a-d *.mp3 *.wma') do (
  4.     set "str=%%~nxi"
  5.     for /f "delims=" %%j in ("%%~dpi.") do (
  6.         set str=!str:%%~nj_=!
  7.         ren "%%i" "%%~nj_!str!"
  8.     )
  9. )
  10. pause
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 ezfriend 于 2008-10-10 18:18 发表
我试了的,没有用呀!还在在重复累加!

  经过实际测试,我在14楼的代码完全可以实现在文件名前添加歌手信息,如果歌手信息有重复,完全可以清除。若还在累加,则说明你的路径格式和楼主的不一样,或者不是用前面所提供的代码生成文件名。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

  set str=!str:%%~nj_=! 的意思是删除文件名中所有的 文件夹名_ 这个字符串,也就是删除音乐文件名中的歌手信息,其中,%%~nj 表示文件夹名。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

返回列表