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ę!
command-line
batch
tt_1111
źródło
źródło
Odpowiedzi:
Powinieneś użyć swojej
FOR
konstrukcji doCD
każ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)
Przykład
Zmień katalog na każdy podfolder w C: \ Pracuj kolejno:
Spróbuj wykonać następujące czynności jako plik wsadowy
Uwagi:
źródło
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 enableDelayedExpansion
u 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.
Podwojone procenty, jeśli użyjesz polecenia w skrypcie wsadowym.
źródło