DOS Batch - Pobierz bieżący katalog w pętli for

0

Zamierzam napisać małą partię DOS, która tworzy pliki m3u dla danej struktury podkatalogu zawierającej pliki dźwiękowe. Plik m3u powinien mieć nazwę „[Katalog nadrzędny] .m3u” (gdzie [Katalog nadrzędny] zastępuje się, oczywiście, faktyczną nazwą katalogu nadrzędnego).

Moja partia do tej pory:

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

Cóż - krótko mówiąc, to nie działa zgodnie z przeznaczeniem. Pliki m3u są tworzone, ale mają nazwy takie jak „.m3u” (Tak, tylko rozszerzenie, bez nazwy).

Prawdopodobnie powodem jest to, że DOS nie pozwala na wywołanie pętli for w innej pętli for.

Hmmph - czy jest jakiś sposób na uzyskanie nazwy bieżącego katalogu (i tylko bieżącej, a nie całej ścieżki!) Podczas pracy przez zewnętrzną pętlę for?

Dziękuję za każdą przydatną wskazówkę!

tt_1111
źródło
Zamiast tego możesz poprosić o to w Przepełnieniu stosu .
lzam
DOS nie ma pętli for. Ma tylko cmd systemu Windows NT. Są bardzo różne
phuclv

Odpowiedzi:

0

Powinieneś użyć swojej FORkonstrukcji do CDkażdego podkatalogu i uruchomić komendę z tego podkatalogu.

Źródło dla / R Pętla przez pliki (podfoldery Recurse)

Pętla przez pliki (podfoldery Recurse)

Składnia FOR / R [[dysk:] ścieżka] %% parametr IN (ustaw) polecenie DO

Klawisz

dysk: ścieżka: drzewo folderów, w którym znajdują się pliki.

zestaw: zestaw jednego lub więcej plików. Należy użyć symboli wieloznacznych. Jeśli (set) jest znakiem kropki (.), Wówczas FOR przejdzie przez każdy folder.

polecenie: polecenie (polecenia) do wykonania, w tym wszelkie parametry wiersza polecenia.

Parametr %%: Parametr wymienny: w pliku wsadowym użyj %% G (w wierszu polecenia% G)

To polecenie przechodzi w dół drzewa folderów, zaczynając od ścieżki [drive:], i wykonuje instrukcję DO dla każdego pasującego pliku.

Jeśli ścieżka [dysk:] nie zostanie określona, ​​domyślnie zostanie ustawiona bieżąca ścieżka: ścieżka.

Przykład

Zmień katalog na każdy podfolder w C: \ Pracuj kolejno:

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

Spróbuj wykonać następujące czynności jako plik wsadowy

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

Uwagi:

  • % CD% to bieżący katalog.
DavidPostill
źródło
0

Powodem, dla którego twoje nazwy wyjściowe mają tylko rozszerzenie, jest to, że próbujesz rozwinąć zmienną X w tym samym bloku, który ją ustawia. Normalne rozwinięcie występuje, gdy instrukcja jest analizowana, a cały blok jest analizowany jednocześnie. Otrzymujesz więc wartość X, która istniała przed wejściem w pętlę (nie zdefiniowana).

Problem ten można rozwiązać za pomocą opóźnionego rozszerzenia ( setlocal enableDelayedExpansionu góry i !X!zamiast %X%. Ale jest lepszy sposób, który jest jeszcze prostszy niż rozwiązanie DavidPostill.

Poniższe będą działać bezpośrednio w wierszu poleceń - nie jest wymagany skrypt wsadowy.

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

Podwojone procenty, jeśli użyjesz polecenia w skrypcie wsadowym.

dbenham
źródło