我打算编写一个小的 DOS 批处理程序,为包含声音文件的给定子目录结构创建 m3u 文件。m3u 文件的名称应为“[Parent Directory].m3u”(其中 [Parent Directory] 当然由父目录的实际名称替换)。
我目前的批次:
FOR /D /R %%I IN (\*.\*) DO (
IF EXIST "%%I\\*.mp3" (
FOR %%* in ("%%I") do set X=%%~n*
DIR /B "%%I\\*.mp3" > "%%I\\%X%.m3u"
)
)
嗯——简而言之,它没有按预期工作。m3u 文件已创建,但它们的名称为“.m3u”(是的,只有扩展名,根本没有名称)。
原因可能是 DOS 不允许在一个 for 循环中调用另一个 for 循环。
哼——在执行外部 for 循环时,有没有办法获取当前目录名称(并且仅获取当前目录名称,而不是整个路径!)?
非常感谢任何有用的提示!
答案1
您应该使用您的FOR
构造CD
进入每个子目录并从子目录内运行您的命令。
循环遍历文件(递归子文件夹)
语法 FOR /R [[drive:]path] %%parameter IN (set) DO 命令
钥匙
drive:path :文件所在的文件夹树。
set :一组或多份文件。必须使用通配符。如果 (set) 是句点字符 (.),则 FOR 将循环遍历每个文件夹。
command:要执行的命令,包括任何命令行参数。
%%parameter :可替换参数:在批处理文件中使用 %%G(在命令行上为 %G)
此命令从 [drive:]path 开始遍历文件夹树,并对每个匹配的文件执行 DO 语句。
如果未指定 [drive:]path,则它们将默认为当前 drive:path。
一个例子
依次将目录更改为 C:\Work 下的每个子文件夹:
FOR /R "C:\Work\" %%G in (.) DO (
Pushd %%G
Echo now in %%G
Popd )
Echo "back home"
尝试将以下内容作为批处理文件
FOR /R %%G in (.) DO (
Pushd %%G
IF EXIST "*.mp3" (
DIR /B *.mp3 > "%CD%.m3u"
)
Popd
)
笔记:
- %CD% 是当前目录。
答案2
输出名称只有扩展名的原因在于您尝试在设置它的同一块中扩展 X 变量。正常扩展发生在解析语句时,并且会一次解析整个块。因此,您获得的是进入循环之前存在的 X 值(未定义)。
setlocal enableDelayedExpansion
该问题可以通过使用延迟扩展(在顶部,而!X!
不是)来解决%X%
。但有一种比DavidPostill解决方案更简单的更好的方法。
以下内容将直接在命令行上运行 - 无需批处理脚本。
for /r %F in (.) do @if exist "%F\*.mp3" dir /b *.mp3 >"%F\%~nxF.mp3"
如果在批处理脚本中使用该命令,则将百分比加倍。