Pregunta

Estoy intentando llevar a cabo la siguiente tarea ridícula:

Tengo un archivo de texto que contiene un conjunto de filesnames totalmente calificados. Quiero recorrer el archivo y añadir cada línea a una variable común, que se puede pasar a una herramienta de línea de comandos. Por ejemplo, el archivo podría ser:

  

C: \ dir \ test.txt

     

C: \ WINDOWS \ test2.txt

     

C: \ text3.txt

y me gustaría asignarlos a alguna variable 'a' tal que:

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

Una cuestión secundaria es - lo que es una buena referencia de archivo por lotes? Estoy encontrando algunas cosas en el material de Windows, y una gran cantidad de sitios web de cosecha propia, pero nada particularmente completa.

¿Fue útil?

Solución

En cuanto a las referencias, SS64.com no es malo. Rob van der Woude obtiene vinculado con bastante frecuencia, también.


En cuanto a su problema, eso es fácil:

@echo off
setlocal enableextensions enabledelayedexpansion

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

echo %LIST%

endlocal

Más explicación en profundidad:

setlocal enableextensions enabledelayedexpansion

Estamos permitiendo expansión retardada aquí. Esto es crucial, ya que de lo contrario no sería capaz de manipular la lista de archivos dentro del bucle for que sigue.

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

itera for /f más líneas en un archivo, por lo que es exactamente lo que necesitamos aquí. En cada iteración del bucle añadimos la siguiente línea a la variable LIST. Observe el uso de !LIST! en lugar de la habitual %LIST%. Esto indica expansión retardada y asegura que la variable se re-evaluado cada vez que se ejecuta este comando.

Por lo general cmd expande las variables a sus valores tan pronto como una línea se lee y analiza. Para cmd una sola línea es o bien una línea o todo lo que recuentos como una línea, que pasa a ser verdad para los bloques delimitados por paréntesis, como la que usamos aquí. Así que para cmd el bloque completo es una sola declaración que consigue leída y analizada una vez, independientemente de la frecuencia con el interior de las carreras de bucle.

Si hubiéramos utilizado %LIST% aquí en lugar de !LIST! entonces la variable habría sido reemplazado de inmediato por su valor (vacío en ese momento) y el bucle habríamos tenido este aspecto:

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

Es evidente que esto no es lo que queríamos. expansión retardada se asegura de que una variable se expandió sólo cuando su valor es realmente necesario. En este caso, cuando el interior de las carreras de bucle y construye una lista de nombres de archivo.

Después %LIST% la variable o !LIST! (ahora que en realidad no importa ya cuál utilizar) contiene la lista de las líneas del archivo.

Curiosamente, la ayuda para el comando set incluye exactamente este ejemplo para la expansión retardada:

  

Por último, el apoyo a retrasarse   expansión variable de entorno tiene   ha agregado. Este apoyo es siempre   desactivado por defecto, pero puede ser   activado / desactivado a través del comando / V   modificador de la línea de cmd.exe. Ver CMD /?

     

entorno retardada expansión de variables   es útil para moverse por la   limitaciones de la expansión actual   que sucede cuando una línea de texto es   leer, no cuando se ejecuta. los   ejemplo siguiente demuestra la   problema con la variable inmediata   expansión:

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

nunca mostrar el mensaje, ya   el% VAR% en ambos si es declaraciones   sustituido, cuando la primera IF   declaración se lee, ya que lógicamente   incluye el cuerpo de la IF, que es   una sentencia compuesta. Por lo que el SI   dentro de la sentencia compuesta es   Realmente comparación "antes" con el "después"   que nunca será igual. Similar,   el siguiente ejemplo no funcionará como se   espera:

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

en que no va a construir una lista de   archivos en el directorio actual, pero   en su lugar sólo se definirá en la lista   variable en el último archivo encontrado.   Una vez más, esto se debe a la LISTA% es%   ampliado una sola vez cuando el POR   declaración se lee, y en ese momento   la variable de lista está vacía. Entonces el   real bucle FOR estamos ejecutando es:

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

, que sólo mantiene a la lista de ajustes   último archivo encontrado.

     

entorno retardada expansión de variables   le permite usar una diferente   carácter (el signo de exclamación) a   ampliar las variables de entorno en   Tiempo de ejecución. Si la variable retardada   expansión está activada, el anteriormente   ejemplos podrían escribirse como sigue   a funcionar como está previsto:

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%

Otros consejos

Lo que busca es que se puede hacer con un href="http://www.robvanderwoude.com/ntfortokens.php" rel="nofollow noreferrer"> PARA / F comando

Esto es un buen recurso que he utilizado muchas veces:

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

Un buen libro: Windows NT Shell Scripting por Tim Hill. La edición que tengo se publicó en 1998, pero todavía es válida para los programas del sistema de Windows en Windows 2008.

type *commonfilepart* >> concat_result_file

SO: Windows Server 2003

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top