DOS Batch - Obtém o diretório atual enquanto estiver em um loop for

0

Eu pretendo escrever um pequeno lote DOS que crie arquivos m3u para uma dada estrutura de subdiretórios contendo arquivos de som. O arquivo m3u deve ter o nome '[Diretório pai] .m3u' (onde [Diretório pai] é substituído pelo nome real do dicretor pai, é claro).

Meu lote até agora:

FOR /D /R %%I IN (\*.\*) DO (
IF EXIST "%%I\*.mp3" (
    FOR %%* in ("%%I") do set X=%%~n*
    DIR /B "%%I\*.mp3" > "%%I\%X%.m3u"
    )
)

Bem, para resumir, não funciona como planejado. Os arquivos m3u são criados, mas eles têm nomes como '.m3u' (Yepp, apenas a extensão, nenhum nome).

A razão provavelmente é que o DOS não permite chamar um loop for dentro de outro loop.

Hmmph - existe alguma maneira de obter o nome do diretório atual (e apenas o atual, não o caminho inteiro!) enquanto trabalha através de um loop externo?

Obrigado por qualquer dica útil!

    
por tt_1111 23.09.2014 / 03:52

2 respostas

0

Você deve usar sua FOR construct para CD em cada subdiretório e executar seu comando a partir do subdiretório.

Source Para / R Loop através de arquivos (subpastas Recurse)

Repetir os arquivos (subpastas Recurse)

Syntax FOR /R [[drive:]path] %%parameter IN (set) DO command

Key

drive:path : The folder tree where the files are located.

set : A set of one or more files. Wildcards must be used. If (set) is a period character (.) then FOR will loop through every folder.

command : The command(s) to carry out, including any command-line parameters.

%%parameter : A replaceable parameter: in a batch file use %%G (on the command line %G)

This command walks down the folder tree starting at [drive:]path, and executes the DO statement against each matching file.

If the [drive:]path are not specified they will default to the current drive:path.

Um exemplo

Altere o diretório para cada subpasta em C: \ Work por vez:

FOR /R "C:\Work\" %%G in (.) DO (
    Pushd %%G
    Echo now in %%G
    Popd )
Echo "back home"

Tente o seguinte como seu arquivo de lote

FOR /R %%G in (.) DO (
    Pushd %%G
    IF EXIST "*.mp3" (
        DIR /B *.mp3 > "%CD%.m3u"
    )
    Popd
)

Notas:

  • % CD% é o diretório atual.
por 23.09.2014 / 10:20
0

A razão pela qual seus nomes de saída têm apenas uma extensão é porque você tenta expandir a variável X no mesmo bloco que a define. A expansão normal ocorre quando a instrução é analisada e o bloco inteiro é analisado de uma só vez. Então você obtém o valor de X que existia antes do loop ser inserido (não definido).

Esse problema pode ser resolvido usando a expansão atrasada ( setlocal enableDelayedExpansion no topo e !X! em vez de %X% . Mas existe uma maneira melhor que é ainda mais simples que a solução do DavidPostill.

O seguinte irá funcionar diretamente na linha de comando - não é necessário script em lote.

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

Duplique as porcentagens se você usar o comando em um script em lote.

    
por 24.09.2014 / 02:15