Comment lire une chaîne avec “!” À partir d’un fichier dans le script batch Windows?

J’écris un script batch pour lire un fichier. Le fichier contient des lignes telles que token = value. J’ai du code pour parsingr chaque ligne du fichier et il est stocké dans %% i. Le code suivant tente d’extraire la valeur du jeton:

Notez que ce script utilise l’extension retardée, comme indiqué dans les commentaires.

for /f "tokens=1* delims==" %%a in ("%%i") do ( if "%%a"=="password" ( set password=%%b ) ) 

Si la valeur du mot de passe contient “!”, Alors “!” est ignoré et seul le rest de la chaîne est stocké dans le mot de passe variable. Exemple, si la ligne est:

password = Test!

puis variable password = Test. J’ai essayé de changer le fichier d’entrée de différentes manières et le script batch lit tout sauf “!”. J’ai utilisé:

  1. password = “Test!”
  2. password = “Test ^!”
  3. mot de passe = Test%!

    mot de passe = Test%!

et tout saute “!” Toute idée de comment lire une chaîne avec “!” dans une variable?

En supposant que vous utilisez l’extension de variable différée, désactivez-la temporairement pour la comparaison. Pour comparer en mode non retardé, j’parsing le fractionnement actuel de la ligne ! et vérifiez si le premier jeton est identique à la ligne entière:

 @echo off setlocal enableDelayedExpansion for /f "delims=" %%i in (sourcefile.txt) do ( setlocal disableDelayedExpansion for /f "delims=! tokens=1" %%z in ("%%i") do ( if "%%z"=="%%i" ( rem The line has no ! for /f "tokens=1* delims==" %%a in ("%%i") do ( if "%%a"=="password" ( set "password=%%b" ) ) ) ) endlocal ) pause 

Cependant, la variable password ne sera disponible que dans le contexte setlocal interne. Pour l’exporter, utilisez cette réponse .

Je ne rencontre pas ce problème avec le code que vous avez posté. Je pense que l’erreur peut précéder le code que vous avez posté qui stocke chaque ligne du fichier dans %% i.

Placez une déclaration echo avant votre %% une boucle afin de pouvoir vérifier le contenu de %% i avant de poursuivre le traitement. Je soupçonne fortement que le point d’exclamation n’est pas en %% i en premier lieu.

Voici le fichier CMD complet que j’ai exécuté sur Windows 7:

 @echo off for /f "tokens=1* delims= " %%i in ("password=Test!") do ( echo i: %%i for /f "tokens=1* delims==" %%a in ("%%i") do ( if "%%a"=="password" ( set password=%%b ) ) ) echo password: %password% 

La sortie est la suivante:

 i: password=Test! password: Test! 

Donc, vous pouvez voir ce Test! est en train de passer à travers la boucle for intacte lorsque %% i contient password=Test! . Si vous souhaitez publier les premières parties de votre fichier de commandes, nous pouvons vous aider à résoudre le problème.