2010-07-07 11 views
2

Pourquoi cela ne fonctionne-t-il pas?Windows Batch File Math Weirdness

@echo off 

for /l %%i in (0, 1, 100) do (
    for /l %%j in (0, 1, 10) do (
     set /a curr=%%i*10 + %%j 
     echo %curr% 
    ) 
    echo "-----------------------------" 
) 

C'est la sortie que je reçois de ceci:

1010 
1010 
1010 
1010 
1010 
1010 
1010 
1010 
1010 
1010 
1010 
"----------------------------" 
1010 
1010 
1010 
1010 
1010 
1010 
1010 
1010 
... 

Il semble que ce précalcule les mathématiques avant d'exécuter, de sorte que quand il n'exécute enfin, %curr% est déjà à 1010. Comment puis-je le garder de faire ça? Je suis en train d'obtenir la sortie comme ceci:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
"----------------------------" 
11 
12 
... 

Merci à l'avance

Réponse de Johannes Rössel (pour ceux qui pourraient chercher plus tard):

@echo off 
setlocal enabledelayedexpansion enableextensions 

for /l %%i in (0, 1, 100) do (
    for /l %%j in (0, 1, 10) do (
     set /a curr=%%i*10+%%j 
     echo !curr! 
    ) 
    echo "-----------------------------" 
) 
+0

k, fixé que dans ma question (dans mon fichier batch réel, j'ai eu le '/ a' là-dedans correctement) –

Répondre

5

utilisation retardée par l'expansion mettre la ligne suivante avant vos boucles:

setlocal enabledelayedexpansion enableextensions 

Puis utilisez la variable d'environnement a s !curr! au lieu de %curr%.

Vous modifiez le contenu d'une variable d'environnement dans un bloc et réutilisez le contenu modifié dans le même bloc. Cela ne peut pas fonctionner sans une expansion retardée. La raison est que cmd développe des variables telles que %foo% lors de l'analyse d'une commande - et une commande comme if ou for inclut également le bloc qui peut suivre. L'expansion différée provoque l'évaluation des variables juste avant d'exécuter une commande, ce que vous voulez ici.

help set inclut une description de ce qui ne va pas sans expansion différée et fonctionne avec.

+0

Awesome! Fonctionne très bien! Merci! Voici le code avec les changements pour tous ceux qui cherchent d'autre pour elle: @echo off EnableExtensions setlocal de ENABLEDELAYEDEXPANSION pour/l %% i dans (0, 1, 100) faire (pour /l %% j (0 , 1, 10) faire ( set/a curr = %% i * 10 + %% j echo! Curr! ) echo "------------------ ----------- " ) –

+0

grrr ... Je vais l'ajouter dans mon post original pour garder le bon formatage ... –