Utilisation de Call SET pour désigner une variable dans un lot Dos "For" Loop


Essayer d'utiliser Call SET pour définir une variable dans une boucle de fichier batch Windows. Ne fonctionne pas, mais voici le fichier d'entrée / sortie. En essayant d'assigner Var C à égal 1.

Fichier par lots:

@ECHO OFF for /f "tokens=1-3 delims=," %%a in (Puck.csv) do ( echo Hello No Hockey>%%a.txt echo #:A %%a>>%%a.txt echo #:B %%b>>%%a.txt if /I %%c gtr 10 call set %%c==1 echo #:C %%c>>%%a.txt ) 

Puck.csv

 1991,NHL Strike,20 1992,NHL Strike,20 1993,NHL Strike,20 

Sortie:

 Hello No Hockey #:A 1991 #:B NHL Strike #:C 20 Hello No Hockey #:A 1992 #:B NHL Strike #:C 20 Hello No Hockey #:A 1993 #:B NHL Strike #:C 20 

    Vous avez 2 problèmes:

    1) Vous êtes en train de confondre les variables FOR avec les variables d'environnement. Un lot pour nom de variable est toujours un caractère unique, et il est accessible par 2 pour cent avant le nom: %%c . La valeur de variable A FOR ne peut pas être modifiée avec SET.

    Un nom de variable d'environnement peut contenir plusieurs caractères, bien qu'il puisse être un caractère unique, et il est accessible en joignant le nom en pourcentages: %var% . Les points d'exclamation peuvent être utilisés si vous souhaitez une expansion retardée:! !var! . Une valeur de variable d'environnement est définie avec SET.

    2) L'astuce CALL pour accéder aux valeurs de variable d'environnement qui ont été définies dans un bloc de code entre parenthèses est utilisée au moment de l'expansion, et non pas lorsque vous définissez la valeur.

    Je crois que mousio a fourni la meilleure réponse; J'utilise toujours une expansion retardée comme dans cette réponse. Mais il est possible de faire ce que vous voulez sans expansion retardée en utilisant correctement une variable d'environnement et le tour CALL.

     @echo off for /f "tokens=1-3 delims=," %%a in (Puck.csv) do ( echo Hello No Hockey>%%a.txt echo #:A %%a>>%%a.txt echo #:B %%b>>%%a.txt set C=%%c if /i %%c gtr 10 set C=1 call echo #:C %%C%%>>%%a.txt ) 

    Notez qu'il est essentiel que le cas de la variable FOR soit différent de la variable d'environnement. Les variables FOR sont sensibles à la casse, les variables d'environnement ne le sont pas. Si vous utilisez c pour les deux, l'analyseur traitera %%c%% comme la variable FOR suivie d'un pourcentage – pas ce que vous voulez.

      @ECHO OFF setlocal enabledelayedexpansion for /f "tokens=1-3 delims=," %%a in (Puck.csv) do ( echo Hello No Hockey>%%a.txt echo #:A %%a>>%%a.txt echo #:B %%b>>%%a.txt set c=%%c if /I !c! gtr 10 set c=1 echo #:C !c!>>%%a.txt ) 

    Juste la recherche a enabledelayedexpansion et d'apprendre quand et comment l'utiliser (avec ! lieu de % ).
    En outre, il n'est pas nécessaire d'utiliser l' call lors de la réinitialisation de c (en utilisant un seul = ).