Domanda

Sto cercando di realizzare il seguente ridicolo attività:

Ho un file di testo contenente una serie di completo filesnames.Ho voglia di scorrere il file e aggiungere ogni riga di una variabile comune, che può essere passato a un tool a linea di comando.Per esempio, il file potrebbe essere:

C:\dir est.txt

C:\WINDOWS est2.txt

C: ext3.txt

e vorrei assegnare ad una variabile 'a' tale che:

a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt"

Secondario domanda è: - che cosa è un buon file batch di riferimento?Mi sto trovando un po ' di roba in Windows materiale, e un sacco di home-grown siti web, ma nulla di particolarmente completo.

È stato utile?

Soluzione

Come per i riferimenti, SS64.com non è male. Rob van der Woude viene collegato abbastanza spesso, troppo.


Per il tuo problema, che non è facile:

@echo off
setlocal enableextensions enabledelayedexpansion

set LIST=
for /f %%x in (yourfile.txt) do (
    set LIST=!LIST! "%%x"
)

echo %LIST%

endlocal

Spiegazione più approfondita:

setlocal enableextensions enabledelayedexpansion

Stiamo permettendo in ritardo di espansione qui.Questo è fondamentale, altrimenti non saremmo in grado di manipolare la lista di file all'interno della for ciclo che segue.

for /f %%x in (yourfile.txt) do (
    set LIST=!LIST! "%%x"
)

for /f scorre le righe in un file, in modo esattamente ciò di cui abbiamo bisogno qui.In ogni iterazione del ciclo aggiungiamo la riga successiva per il LIST variabile.Nota l'uso di !LIST! invece del solito %LIST%.Questo segnale ritardato di espansione e assicura che la variabile viene rivalutato ogni volta che viene eseguito questo comando.

Di solito cmd espande le variabili per i loro valori appena una riga viene letto e analizzato.Per cmd una singola riga è una riga o di quello che conta come una linea, che risulta vero per blocchi delimitati da parentesi, come quello che abbiamo usato qui.Così, per cmd il blocco è una singola istruzione che viene letto e analizzato una sola volta, indipendentemente di come spesso l'interno del ciclo viene eseguito.

Se avessimo usato %LIST% qui invece !LIST! quindi la variabile sarebbe stato sostituito immediatamente con il suo valore (a vuoto, a quel punto) e il ciclo avrebbe guardato come questo:

for /f %%x in (yourfile.txt) do (
    set LIST= "%%x"
)

Chiaramente questo non è ciò che volevamo.In ritardo di espansione consente di verificare che una variabile è espansa solo quando il suo valore è davvero necessario.In questo caso, quando l'interno del ciclo viene eseguito e si costruisce una lista di nomi di file.

Successivamente la variabile %LIST% o !LIST! (ora non importa più quale usare) contiene l'elenco di righe del file.

Stranamente, l'aiuto per il set il comando include esattamente questo esempio per il ritardo di espansione:

Infine, il supporto per il ritardo variabile di ambiente di espansione ha stato aggiunto.Questo supporto è sempre disabilitato per impostazione predefinita, ma può essere attivato/disattivato tramite il comando /V la linea passa a CMD.EXE.Vedere CMD /?

In ritardo variabile di ambiente di espansione è utile per muoversi in limitazioni dell'attuale espansione che succede quando una riga di testo è leggere, non quando viene eseguita.Il esempio seguente viene illustrato l' problema con immediata variabile di espansione:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)

non avrebbe mai visualizzare il messaggio, in quanto %VAR% in ENTRAMBI, in CASO di dichiarazioni sostituiti quando il primo SE istruzione di lettura, in quanto logicamente include il corpo della SE, che è un'istruzione composta.Quindi, SE il all'interno dell'istruzione composta veramente a confronto "prima" con "dopo" che non saranno mai uguali.Allo stesso modo, l'esempio seguente non funziona come previsto:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%

in quanto NON crea un elenco di file nella directory corrente, ma invece imposta la LISTA variabile per l'ultimo file trovato.Ancora una volta, questo è perché l' %LISTA% è espanso solo una volta PER dichiarazione di leggere, e a quel tempo ELENCO variabile è vuota.Così il effettivo PER il ciclo che stiamo attuando è:

for %i in (*) do set LIST= %i

che mantiene l'impostazione di ELENCO per l' ultimo file trovato.

In ritardo variabile di ambiente di espansione consente di utilizzare un diverso carattere (il punto esclamativo) per espandere le variabili di ambiente in tempo di esecuzione.Se ritardo variabile l'espansione è attivata, il sopra gli esempi potrebbero essere scritto come segue per funzionare correttamente:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

Altri suggerimenti

Che cosa siete dopo può essere fatto con un PER comando / F.

Ecco una buona risorsa che ho usato molte volte:

http://www.robvanderwoude.com/batchfiles.php

Un buon libro: Windows NT Shell Scripting da Tim Hill. L'edizione che ho è stato pubblicato nel 1998, ma è ancora valido per i programmi di comando di Windows in Windows 2008.

type *commonfilepart* >> concat_result_file

OS: Windows Server 2003

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top