2013-10-23 9 views
12

Ho bisogno di ottenere tutti i nomi di file in una directory e di memorizzarli in alcune variabili da una riga di comando.Come ottenere l'elenco dei nomi di file in una directory e memorizzarlo in una variabile utilizzando i comandi cmd

mi sono imbattuto in questo

`dir /s /b > print.txt` 

ma questo la stampa dei nomi dei file in un file txt.

Come posso memorizzare questi nomi in una variabile?

+0

Utilizzare 'FOR' per inserirli in una variabile. per/f% a in ('dir/s/b') do (echo% a) dalla riga di comando o raddoppia il %% se in un file batch. –

+1

Possibile duplicato di [File batch - Scrive l'elenco dei file nella variabile] (https://stackoverflow.com/questions/3238433/batch-file-write-list-of-files-to-variable) –

risposta

21

Suppongo che si intenda veramente un file batch di Windows, non DOS.

variabili d'ambiente Batch sono limitati a 8191 caratteri, quindi probabilmente non sarà in grado di adattarsi a tutti i percorsi dei file in un'unica variabile, a seconda del numero di file e la durata media percorso del file.

I nomi dei file devono essere citati nel caso in cui contengano spazi.

Supponendo si inseriscono in una variabile, è possibile utilizzare:

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

dichiarazione la chiamata è piuttosto lento. È più veloce utilizzare l'espansione ritardata, ma l'espansione di %%F danneggerà qualsiasi valore contenente ! se l'espansione ritardata è abilitata. Con un po 'più di lavoro, puoi avere una versione di espansione ritardata veloce e sicura.

@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%) 

Se i nomi dei file non rientrano in una variabile, allora si dovrebbe ricorrere a una matrice pseudo di valori, uno per ogni file. Nello script seguente, utilizzo FINDSTR per il prefisso di ogni riga di DIR ouptut con un prefisso del numero di riga. Io uso il numero di riga come indice per l'array.

@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

MODIFICA - Ahi! Risolto un bug maggiore nella seconda soluzione (versione sicura) che nessuno aveva rilevato da due anni! L'aspetto sicuro è stato interrotto finché non ho usato '%% A' nell'assegnazione invece di'! File! '. – dbenham

4

Come ha detto @ Matt, utilizzare un file batch.

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

L'espansione ritardata si corrompe qualsiasi nome di file che contiene '!'. – dbenham

Problemi correlati