2010-01-08 151 views
67

Tengo un directorio para el que quiero enumerar todos los archivos .doc con un ;.¿Cómo concatenar cadenas en un archivo por lotes de Windows?

que saber lo siguiente ecos de comandos por lotes todos los archivos:

for /r %%i In (*.doc) DO echo %%i 

Pero ahora quiero poner a todos en una variable, añadir un ; en el medio y el eco todos a la vez.
¿Cómo puedo hacer eso?

set myvar="the list: " 
for /r %%i In (*.doc) DO <what?> 
echo %myvar% 

Respuesta

58

¿Qué hay de:

@echo off 
set myvar="the list: " 
for /r %%i in (*.doc) DO call :concat %%i 
echo %myvar% 
goto :eof 

:concat 
set myvar=%myvar% %1; 
goto :eof 
+2

Gracias mucho por esta respuesta! Me acabo de solucionar un problema al crear dinámicamente un classpath en un archivo de proceso por lotes :) Añadiendo las modificaciones necesarias, pero mi problema fue hacer el concat y esto lo solucionó. – Charliemops

43

basado en la solución de Rubens, necesita habilitar expansión retardada de variables env (tipo "ayuda setlocal" o "cmd de ayuda") para que el var es correcta evaluado en el bucle:

@echo off 
setlocal enabledelayedexpansion 
set myvar=the list: 
for /r %%i In (*.sql) DO set myvar=!myvar! %%i, 
echo %myvar% 

Ten en cuenta también la siguiente restricción (MSDN):

El entorno individual máximo de tamaño variable es 8192bytes.

+1

La restricción es incorrecta. El tamaño máximo de variable de entorno en Windows es alrededor de 64 KiB, por lo que alrededor de 32k caracteres. En los archivos por lotes, sin embargo, tiene el problema de que la longitud máxima de la línea de comandos es de 8190 caracteres, por lo que cada variable de entorno que establezca allí debe ser más corta. Además, la restricción del entorno total de 65 KiB es falsa. Acabo de crear variables de entorno que suman unos pocos MiB sin problemas. – Joey

+2

El enlace dice 65 MIL KB, que equivaldrían a 64 MB. Sin embargo, no voy a discutir, ya que nunca he tratado con eso. – devio

+1

¡Muchas gracias, hombre! Hiciste mi día :-) – Julien

0

Tenga en cuenta que las variables @fname o @ext se pueden concatenar simplemente. Este:

forfiles /S /M *.pdf /C "CMD /C REN @path @[email protected]" 

cambia el nombre de todos los archivos PDF a "filename_old.pdf"

Cuestiones relacionadas