DOS 批处理-在 for 循环中获取当前目录

DOS 批处理-在 for 循环中获取当前目录

我打算编写一个小的 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 循环遍历文件(递归子文件夹)

循环遍历文件(递归子文件夹)

语法 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"

如果在批处理脚本中使用该命令,则将百分比加倍。

相关内容