2010-04-30 25 views
6

Tengo una aplicación java iniciada por un archivo .cmd. Quiero establecer el classpath de la aplicación a través de este lote, todos los archivos jar necesarios están en una carpeta lib.Lote y para el bucle

Aquí es lo que he intentado:

set _classpath=. 
for %%i in (%1/lib/*.*) do (set _classpath=%_classpath%;%%i) 

Sorprendentemente, parece que no actúa como se espera. Digamos que hay 3 frasco en la carpeta lib:

  • pikachu.jar
  • sonic.jar
  • mario.jar

Aquí es lo que sucede:

  1. conjunto _classpath =.
  2. conjunto _classpath = .; pikachu.jar
  3. conjunto _classpath = .; sonic.jar
  4. conjunto _classpath = .; mario.jar

Obviamente, lo que busco es conseguir

  • conjunto _classpath = .; pikachu.jar; sonic.jar; mario.jar

Cualquier idea ?

Gracias y saludos,

+1

¿Por qué necesita un archivo por lotes para incluir la ruta de clases código de listado completo? ¿Has visto el nuevo truco de Java 6 '-cp" lib/* "' Que incluiría todos los jar en el directorio lib – Pyrolistical

+1

+1 para el fan Smash –

+0

Desafortunadamente, necesitas usar java 5 ... Pero gracias por eso, definitivamente ser útil para proyectos de java 6 – Farid

Respuesta

4

lugar esta en la parte superior de su archivo por lotes:

setlocal enabledelayedexpansion 

Luego dentro del bucle, reemplace %_classpath% con !_classpath!

Sin expansión retardada activada, %_classpath% se amplió una vez, al comienzo de su en bucle.


[Editar] En respuesta a un comentario, aquí es una

@echo off 
setlocal enabledelayedexpansion 

set _classpath=. 
for %%i in (%1/lib/*.*) do (
    set _classpath=!_classpath!;%%i 
) 

echo %_classpath% 
pause 
+0

Gracias BlueRaja (gracias a Richard también), hay otro problema al usar este enfoque. Puedo ver que classpath se ve algo similar al que está al final del ciclo: .; Pikachu.jar; sonic.jar; mario.jar Los espacios son inesperados y duelen. ¿Conoces una manera rápida de deshacerte de ellos? Supongo que podríamos hacer un ajuste correcto en %% i? – Farid

+0

@Farid: Es porque tienes un espacio al final de tu bloque. Ver respuesta editada. –

+0

Muchas gracias! – Farid

1

CMD.EXE está ampliando el %...% antes de ejecutar el bucle.

Necesita expansión de la variable retrasada, esto se explica en set /? desde un símbolo del sistema.