如何用一个批处理bat生成某文件夹和子文件夹下所有文件的绝对路径,分别写入到对应的txt中(一对一生成)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用一个批处理bat生成某文件夹和子文件夹下所有文件的绝对路径,分别写入到对应的txt中(一对一生成)相关的知识,希望对你有一定的参考价值。

我有个“E:\影视”文件夹,里面有若干层(10层以内)的子文件夹,如“电影”“电视剧”“动画片”之类,下面又分别是“中国电影”“美国电影”“韩剧”“国产剧”之类,其下是以电影名称命名的文件夹,如“变形金刚”“千与千寻”“潜伏”等,再里面是具体的影视文件,如“第1部.rmvb”、“上集.avi”,“第3集.f4v”,之类。

现在,我在“影视”文件夹下新建了“播放列表汇总”文件夹,要求通过一个批处理文件,达到:

1.“影视”文件夹下的所有影音文件,每一个文件都对应生成一个txt文件(即假如共有100个影音文件,则生成100个对应的txt文件):
A.该txt的文件命名规则是“上层文件夹名_这个影音文件名的前缀.mpcpl”(如“变形金刚_第1部.mpcpl”“千与千寻_上集”“潜伏_第3集.mpcpl”。
B.该txt文件的保存位置,全部保存到“E:\影音\播放列表汇总”文件夹中(有同名文件则覆盖)。
C.该txt文件的内容是这个影音文件的绝对路径,如(“E:\影音\电影\美国电影\变形金刚\第1部.rmvb”,“E:\影音\动画片\日本\千与千寻\上集.avi”“E:\影音\电视剧\国产剧\潜伏\第3集.f4v”,并且遵循下面的格式:
----- 分隔线---内容从下一行开始,无空行----

MPCPLAYLIST
1,type,0
1,filename,E:\影音\动画片\日本\千与千寻\上集.avi

----- 分隔线---内容到上一行结束,无空行--------
对上面内容说明:
1.分3行,第1行和第2行,以及第3行的“1,filename,”都保持不变;
2.第3行的第二个逗号后面的路径“E:\影音\动画片\日本\千与千寻\上集.avi”,是该txt文件所对应的这个影音文件的绝对路径,每个文件都不一样。

求高手给出这个批处理文件的代码。不胜感激。

@echo off
set "x=播放列表汇总"
2>nul (md %x%
for /r %%i in (*) do (
for %%j in ("%%~fi\..") do (
(echo;MPCPLAYLIST
echo;1,type,0
echo;1,filename,%%~fi)>%x%\%%~nxj_%%~ni.mpcpl
)
)
del %x%\影视* %x%\%x%*)
pause

放在"E:\影视"同目录下执行即可。。。追问

感谢您,我的补充问题无法显示,向您直接求助。代码改进要求:一、生成txt内容里的第3行路径改为相对路径,即原“1,filename,E:\影音\动画片\日本\千与千寻\上集.avi”改为“1,filename,..\影音\动画片\日本\千与千寻\上集.avi”。二、排除“播放列表文件夹”,通过把它提升到“影音”文件夹外,问题已解决。三、只对特定后缀名的影音文件进行播放列表的生成,如*.avi、*.rm…,其它后缀名的文件不生成。求改进代码。再谢。

追答

1、我不明白你这个相对路径“..\影音\动画片\日本\千与千寻\上集.avi”是相对于什么文件的路径。。。如果相对于批处理文件所在的路径(E:\影视),那应该是“动画片\日本\千与千寻\上集.avi”。。。不知道你所说的相对路径是相对什么文件的路径。。还是只是单纯的想把E:\改成..\。。
2、依然不明白你表达的意思。。是不想生成“播放列表汇总”文件夹而是想把生成的播放列表放到“E:\影音”下吗?。。。。
3、这个可以改。。。先把前面的描述清楚。。

追问

您好!因追问有字数限制,所以没表述清楚。1.“播放列表汇总”文件夹原先在“影音”文件夹下一级,现决定移出来,提升到跟“影音文件夹”同级,并列。原因:若在“影音”内,则执行代码时会对此文件夹内的文件也生成txt,这是不需要的。所以提一级。“..\影音\……”这个路径,就是针对改动后的“播放列表汇总”文件夹与“影音”文件夹的相对关系。(另外,使用相对路径也是为了便于移植。)2.通过1问题已解决可忽略。3.同前。

追答

@echo off
set "x=播放列表汇总"
2>nul (md %x%
for /r "影视\" %%i in (*.avi *.rm) do (
for %%j in ("%%~fi\..") do (
(echo;MPCPLAYLIST
echo;1,type,0
echo;1,filename,..%%~pnxi)>%x%\%%~nxj_%%~ni.mpcpl
)
))
pause

放在"E:\"下执行即可。。。

追问

感谢您的耐心答复,代码试了可以,非常感谢。但有2点:一、最后相对路径的代码部分不是很准确,是直接去除了e:,不是依据“播放列表汇总”文件夹的上一层来判断的,比如我把“影音”和“播放列表汇总”(这两个原先同在e:下)都复制到“e:\a\”中,按理说,这时“影音”和“播放列表汇总”的相对路径是不变的,txt文本中应反映出来,但实际运行效果,路径错了。二、能否把bat文件放在"E:\"执行,改成可放在任意目录运行。再谢

追答

@echo off&Setlocal EnableDelayedExpansion
set "y=E:\a\影视\" //这里是“影视”文件夹的绝对路径
set "x=%y:影视=播放列表汇总%"
for %%i in (%x%..) do set "z=%%~fnxi"&if "!z!"=="%y:~,3%" set "z=!z:~,2!"
2>nul (md %x%
for /r "%y%" %%i in (*.txt) do (
for %%j in ("%%~fi\..") do (
set "a=%%~fi"
(echo;MPCPLAYLIST
echo;1,type,0
echo;1,filename,..!a:%z%=!)>%x%\%%~nxj_%%~ni.mpcpl
)
))
pause
可放在任意目录运行。。。。。

参考技术A 批处理代码如下:(保存为bat文件,放在任意目录运行)
::═════代═══码═══开═══始═════
@echo off&setlocal enabledelayedexpansion
cd /d "E:\影视"
rd /s/q "E:\影视\播放列表汇总">nul 2>nul
for /f "delims=" %%i in ('dir /a-d/b/s *.*') do (
IF /i not "%%~dpi"=="E:\影视\" (
set p=%%~dpi&set p=!p:~,-1!
for /f "delims=" %%a in ("!p!") do set name=E:\影视\%%~nxa_%%~ni.mpcpl
echo MPCPLAYLIST >"!name!"
echo 1,type,0 >>"!name!"
echo 1,filename,%%i >>"!name!"))
md "E:\影视\播放列表汇总" >nul 2>nul
move /y "*.mpcpl" "E:\影视\播放列表汇总\">nul
pause
::Created By escortmnm from VBS团队
::═════代═══码═══结═══束═════追问

感谢您,我的补充问题无法显示,向您直接求助。代码改进要求:一、生成txt内容里的第3行路径改为相对路径,即原“1,filename,E:\影音\动画片\日本\千与千寻\上集.avi”改为“1,filename,..\影音\动画片\日本\千与千寻\上集.avi”。二、排除“播放列表文件夹”,通过把它提升到“影音”文件夹外,问题已解决。三、只对特定后缀名的影音文件进行播放列表的生成,如*.avi、*.rm…,其它后缀名的文件不生成。求改进代码。再谢。

以上是关于如何用一个批处理bat生成某文件夹和子文件夹下所有文件的绝对路径,分别写入到对应的txt中(一对一生成)的主要内容,如果未能解决你的问题,请参考以下文章

如何用bat遍历文件,并找到文件名包含某字符的文件吗?

如何用bat打开本身目录下的文件?

如何用bat更改文件扩展名

如何用perl查找某目录下 及其子目录下的某类文件

如何用批处理文件执行一个DOS命令

如何用bat复制一个文件夹到另一个文件夹去?