Я намереваюсь написать небольшой пакет DOS, который создает файлы m3u для данной структуры подкаталога, содержащей звуковые файлы. Файл m3u должен иметь имя «[Родительский каталог] .m3u» (где, конечно, [Родительский каталог] заменяется фактическим именем родительского каталога).

Моя партия до сих пор:

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 (Yepp, только расширение, вообще без имени).

Возможно, причина в том, что DOS не позволяет вызывать цикл for внутри другого цикла for.

Hmmph - есть ли способ получить имя текущего каталога (и только текущий, а не весь путь!) во время работы через внешний цикл for?

Благодарю за любую полезную подсказку!

2 ответа2

0

Вы должны использовать свою конструкцию FOR для CD в каждый подкаталог и запустить свою команду из этого подкаталога.

Источник для /R Пропускать файлы (подпапки Recurse)

Перебирать файлы (подпапки Recurse)

Синтаксис FOR /R [[диск:] путь] %% параметр IN (установлен) Команда DO

ключ

диск: путь: дерево папок, в котором находятся файлы.

set: набор из одного или нескольких файлов. Подстановочные знаки должны быть использованы. Если (установлено) является символом точки (.), То FOR будет перебирать каждую папку.

команда: команда (ы) для выполнения, включая любые параметры командной строки.

Параметр %%: заменяемый параметр: в пакетном файле используйте %% G (в командной строке% G)

Эта команда проходит по дереву папок, начиная с пути [drive:], и выполняет оператор DO для каждого соответствующего файла.

Если путь [диск:] не указан, по умолчанию используется текущий путь диск:.

Пример

Измените каталог на каждую подпапку в C:\ Работайте по очереди:

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% является текущим каталогом.
0

Причина, по которой ваши выходные имена имеют только расширение, заключается в том, что вы пытаетесь развернуть переменную X в том же блоке, который ее устанавливает. Нормальное расширение происходит, когда оператор анализируется, и весь блок анализируется одновременно. Таким образом, вы получите значение X, которое существовало до того, как был введен цикл (не определено).

Эта проблема может быть решена с помощью отложенного расширения (setlocal enableDelayedExpansion вверху и !X! вместо %X% . Но есть лучший способ, который даже проще, чем решение Дэвида Постилла.

Следующее будет работать непосредственно в командной строке - пакетный скрипт не требуется.

for /r %F in (.) do @if exist "%F\*.mp3" dir /b *.mp3 >"%F\%~nxF.mp3"

Удвойте проценты, если вы используете команду в пакетном скрипте.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .