2013-10-23 7 views
12

Potrzebuję uzyskać wszystkie nazwy plików w katalogu i przechowywać je w niektórych zmiennych z wiersza polecenia.Jak uzyskać listę nazw plików w katalogu i zapisać, że w zmiennej za pomocą polecenia cmd

natknąłem się na ten

`dir /s /b > print.txt` 

ale wypisuje nazwy plików do pliku txt.

Jak zapisać te nazwy w zmiennej?

+0

Użyj "FOR", aby umieścić je w zmiennej. for/f% a in ("dir/s/b") do (echo% a) z linii poleceń lub podwojone %%, jeśli w pliku wsadowym. –

+1

Możliwy duplikat [Plik wsadowy - Zapisz listę plików do zmiennej] (https://stackoverflow.com/questions/3238433/batch-file-write-list-of-files-to-variable) –

Odpowiedz

21

Zakładam, że naprawdę masz na myśli plik wsadowy systemu Windows, a nie DOS.

Zmienne środowiska wsadowego są ograniczone do 8191 znaków, więc prawdopodobnie nie będzie możliwe dopasowanie wszystkich ścieżek plików do jednej zmiennej, w zależności od liczby plików i średniej długości ścieżki pliku.

Nazwy plików należy cytować, jeśli zawierają spacje.

Zakładając, że pasuje do jednej zmiennej, można użyć:

@echo off 
setlocal disableDelayedExpansion 
set "files=" 
for /r %%F in (*) do call set files=%%files%% "%%F" 

oświadczenie podczas rozmowy jest dość powolne. Szybciej jest używać opóźnionego rozszerzenia, ale rozszerzenie %%F spowoduje uszkodzenie dowolnej wartości zawierającej !, jeśli włączone jest opóźnione rozwijanie. Przy odrobinie więcej pracy możesz mieć szybką i bezpieczną wersję opóźnionego rozszerzenia.

@echo off 
setlocal disableDelayedExpansion 
set "files=." 
for /r %%F in (*) do (
    setlocal enableDelayedExpansion 
    for /f "delims=" %%A in ("!files!") do (
    endlocal 
    set "files=%%A "%%F" 
) 
) 
(set files=%files:~2%) 

Jeśli nazwy plików nie pasuje do jednej zmiennej, to należy odwołać się do tablicy pseudo wartości, po jednym pliku. W poniższym skrypcie używam FINDSTR do prefiksowania każdej linii DIR ouptut z prefiksem numeru linii. Używam numeru wiersza jako indeksu do tablicy.

@echo off 
setlocal disableDelayedExpansion 
:: Load the file path "array" 
for /f "tokens=1* delims=:" %%A in ('dir /s /b^|findstr /n "^"') do (
    set "file.%%A=%%B" 
    set "file.count=%%A" 
) 

:: Access the values 
setlocal enableDelayedExpansion 
for /l %%N in (1 1 %file.count%) do echo !file.%%N! 
+0

EDYCJA - Ouch! Naprawiono poważny błąd w drugim rozwiązaniu (bezpieczna wersja), którego nikt nie wykrył od dwóch lat! Bezpieczny aspekt został złamany, dopóki nie użyłem '%% A' w przypisaniu zamiast'! File! '. – dbenham

4

Jak powiedział @Matt, należy użyć pliku wsadowego.

setlocal enabledelayedexpansion 
set params= 
for /f "delims=" %%a in ('dir /s/b') do set params=!params! %%a 
+0

Opóźnione rozszerzenie ulegnie uszkodzeniu wszelkie nazwy plików zawierające '!'. – dbenham