2 votes

Lire dans un fichier texte multi-ligne et assigner des variables d'environnement à noms multiples dans un fichier de commandes

Je tente de lire à travers un fichier texte multi-ligne comme...

C:\Test.txt

Le fichier texte contient:

bof --------------------------------
Ceci est la ligne 1
  Ceci est la ligne 2
C:\util 
Ceci est la ligne 4
EOF --------------------------------

Je peux lire les lignes et les afficher en utilisant ceci:

@For /F Tokens^=1*Delims^=]^ EOL^= %%A In ('Find /N /V ""^<"C:\test.txt"') Do @Echo(%%B&>Nul echo

Mais:

J'aimerais définir des variables d'environnement à l'intérieur de la boucle au fur et à mesure, donc j'ai besoin de les nommer et de leur assigner la valeur dynamiquement à partir de la boucle.

Afficher à l'écran n'est pas nécessaire pour mes besoins, seules les affectations le sont.

Comment puis-je arriver à un point où je peux faire ce qui suit après l'acquisition des lignes de texte?

Echo _var1=%_var1%
echo _var2=%_var2%
echo _var3=%_var3%
echo _var4=%_var4%

Merci

1voto

programmer365 Points 1

Vous pouvez utiliser l'expansion différée ici :

@echo off & setlocal enableDelayedExpansion & set i=0
@For /F "Tokens=1* Delims=] EOL=" %%A In ('Find /N /V ""^<"C:\test.txt"') Do (
   set /a i=i+1
   set "_var!i!=%%B"
)

Maintenant ici :

For /l %%a in (1,1,4) do echo _var%%a is !var%%a!

Donnera :

_var1 is This is line 1
_var2 is   This is line 2
_var3 is C:\util
_var4 is This is line 4

En savoir plus :

1voto

iTwasnTme Points 5586
@echo off

cd /d "%~dp0" && setlocal EnableDelayedExpansion

for /f ^tokens^=*delims^= %%i in ('type test.txt'
)do set /a "_c+=1+0" && 

------

*   **`test.txt`** contenu/fichier :

    Ceci est la ligne 1
      Ceci est la ligne 2
    C:\dir
    Ceci est la ligne 4
    Ceci est la ligne 5
    C:\util
    Ceci est la ligne 7
    C:\folder
    Ceci est la ligne 9

------

*   Résultats :

    _var1=Ceci est la ligne 1
    _var2=  Ceci est la ligne 2
    _var3=C:\dir
    _var4=Ceci est la ligne 4
    _var5=Ceci est la ligne 5
    _var6=C:\util
    _var7=Ceci est la ligne 7
    _var8=C:\folder
    _var9=Ceci est la ligne 9

------

**1.** Vous n'avez pas besoin d'utiliser `"Tokens=**1*** Delims=**] EOL=**"` pour enregistrer/définir toutes les chaînes de votre ligne dans une variable, donc ce n'est pas nécessaire, utilisez **`tokens^=*delims^=`**, cela définit les jetons à tous et réinitialise/supprime les délimiteurs par défaut.

    ... for /f ^tokens^=*delims^= %%i in (test.txt) ...

**2.** Incrémentez un compteur pour vos lignes afin de pouvoir utiliser une boucle `for /L` de manière dynamique et sans avoir à l'éditer pour ajouter manuellement le nombre de lignes dans votre fichier.

    ... set /a "_c+=1+0" ...

**Remarque :** Lorsque vous utilisez **`+=1+0`** dans **`set /a "_c+=1+0"`**, vous n'avez pas besoin de pré-définir votre variable avec **`set _c=0`**

**3.** Utilisez un opérateur pour définir immédiatement la variable après que le compteur ait été incrémenté en stockant la ligne actuelle en utilisant ce compteur déjà incrémenté

    ... set /a "_c+=1+0" && set "_var!_c!=%%~i" ...

**4.** Pour afficher dynamiquement vos variables/lignes enregistrées, utilisez comme limite de votre boucle **`for /L`** le total déjà enregistré dans la variable **`!_C!`**, et pour les sélectionner, il suffit de travailler avec une concaténation `_var + %%l`

    for /l %%l in (1 1 !_c!)do echo\_var%%l=!_var%%l!

------

**Remarque : 5** Si le premier caractère de la ligne est un <b>espace</b> ou une <b>tabulation</b> et que vous devez le supprimer, il suffit de supprimer le délimiteur :

    for /f ^tokens^=*delims^= %%i in ('type test.txt')do ...

------

    @echo off && setlocal EnableDelayedExpansion

    cd/d "%~dp0" && for /f tokens^=* %%i in (file.txt
    )do set /a "_c+=1+0" && 

``
------

*   **`file.txt`** contenu/fichier :

    Ceci est la ligne 1
    TabCeci est la ligne 2
    C:\dir
    Ceci est la ligne 4
    Ceci est la ligne 5
    SpaceC:\util
    Ceci est la ligne 7
    C:\folder
    Ceci est la ligne 9

------

*   Résultats en supprimant le premier caractère de la ligne s'il est identique aux délimiteurs standard :

    _var1=Ceci est la ligne 1
    _var2=Ceci est la ligne 2
    _var3=C:\dir
    _var4=Ceci est la ligne 4
    _var5=Ceci est la ligne 5
    _var6=C:\util
    _var7=Ceci est la ligne 7
    _var8=C:\folder
    _var9=Ceci est la ligne 9

------

*   Pour aller plus loin :

    [] **[Set /?](https://ss64.com/nt/set.html)**

    [] **[Dir /?](https://ss64.com/nt/dir.html)**

    [] **[For](https://ss64.com/nt/for.html)**

    [] **[For /F](https://ss64.com/nt/for_f.html)**

    [] **[For /L](https://ss64.com/nt/for_l.html)**

    [] **[Findstr /?](https://ss64.com/nt/findstr.html)**

    [] **[Redirections in bat file](https://www.robvanderwoude.com/redirection.php)**

    [] **[Conditional Execution `||` and `&&`](https://ss64.com/nt/syntax-conditional.html)**

    [] **[Comprendre start, 2>nul, cmd, et autres symboles dans un fichier batch](https://stackoverflow.com/questions/19598997/understanding-start-2nul-cmd-and-other-symbols-in-a-batch-file#:%7E:text=A%20command%20can%20output%20to,So%20nothing%20will%20be%20outputted.&text=Line%204%3A%20hard%20to%20tell%20without%20seeing%20rest%20of%20script.)**

`` ```

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X