0

Je voudrais imprimer ce qui suit:Effectuer l'arithmétique en boucle avec des variables dans le lot

0 
1 
2 
3 
4 

J'ai essayé:

ECHO OFF 
FOR /L %%A in (1,1,5) DO (
    SET /a "B=%%A-1" 
    ECHO %B% 
) 

Cependant, cela me donne:

4 
4 
4 
4 
4 

Comment puis-je obtenir la sortie désirée en utilisant à la fois A et B dans mon code?

+2

Il s'agit d'un problème d'expansion retardé. Trop paresseux pour google, mais il y a des centaines de questions comme ça sur SO déjà. Pourquoi ne pas juste 'for/L %% A in (0,1,4)'? Si ce n'est pas pratique, alors vous devriez 'setlocal enabledelayedexpansion' et' echo! B! '. Pour plus d'informations, faites 'help set' dans une console cmd, en faisant attention à la section commençant par" Enfin, la prise en charge de l'expansion de variables d'environnement retardée a été ajoutée. " – rojo

+0

Ce code ne génère pas un ** 4 ** cinq fois. Il sortira 'ECHO IS OFF' cinq fois. – Squashman

+1

@Squashman Il sort 'ECHO IS OFF' cinq fois la première fois que je l'ai exécuté, mais ouput' 4' cinq fois la prochaine fois que je l'ai exécuté. – IslandPatrol

Répondre

1
ECHO OFF 
setlocal 
FOR /L %%A in (1,1,5) DO (
    SET /a "B=%%A-1" 
    call ECHO %%B%% 
) 

Puisque vous n'utilisez pas setlocal, B sera réglé sur la valeur de la course précédente. %B% sera remplacé par 4 car B a été défini sur 4 par l'exécution précédente. l'astuce call echo utilise une analyse syntaxique pour récupérer la valeur actuelle (au moment de l'exécution) de la variable.

Voilà "le fonctionnaire" chemin:

ECHO OFF 
setlocal enabledelayedexpansion 
FOR /L %%A in (1,1,5) DO (
    SET /a "B=%%A-1" 
    ECHO !B! 
) 

En mode delayedexpansion, !var! récupère la valeur de var comme il change au moment de l'exécution. Ce n'est pas sans ses inconvénients, mais vous devez lire sur delayedexpansion pour un guide sur cette question.