2010-04-30 5 views
6

J'ai une application Java lancée par un fichier .cmd. Je veux définir le chemin de classe de l'application à travers ce lot, tous les jars nécessaires sont dans un dossier lib.Batch et la boucle for

Voici ce que j'ai essayé:

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

Étonnamment, il semble que cela ne fonctionne pas comme prévu. Disons qu'il est 3 jar dans le dossier lib:

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

Voici ce qui se passe:

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

De toute évidence, ce que je cherche à obtenir est

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

Toute idée ?

Merci et salutations,

+1

Pourquoi avez-vous besoin d'un fichier batch pour inclure classpath? Avez-vous vu la nouvelle astuce de Java 6 '-cp" lib/* "' Cela inclurait tous les jars dans le répertoire lib – Pyrolistical

+1

+1 pour Smash fan –

+0

Malheureusement, vous devez utiliser java 5 ... Mais merci pour cela, va certainement être utile pour les projets Java 6. – Farid

Répondre

4

Placez ce en haut de votre fichier batch:

setlocal enabledelayedexpansion 

ensuite dans la boucle, remplacer %_classpath% avec !_classpath!

Sans expansion retardée activée, %_classpath% s'élargi une fois, au début de votre pour la boucle.


[Modifier] En réponse à un commentaire, voici un code liste complète

@echo off 
setlocal enabledelayedexpansion 

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

echo %_classpath% 
pause 
+0

Merci BlueRaja (Merci Richard aussi.), Il y a un autre problème à venir en utilisant cette approche. Je peux voir que le classpath ressemble à celui de la fin de la boucle: .; Pikachu.jar; sonic.jar; mario.jar Les espaces sont inexistants et vont faire mal. Connaissez-vous un moyen rapide de se débarrasser d'eux? Je suppose que nous pourrions faire un bon ajustement sur %% i? – Farid

+0

@Farid: C'est parce que vous avez un espace à la fin de votre bloc. Voir la réponse éditée. –

+0

Merci beaucoup! – Farid

1

CMD.EXE élargit la %...% avant d'exécuter la boucle.

Vous avez besoin d'une extension de variable différée, expliquée dans set /? à partir d'une invite de commande.

Questions connexes