Il me ne sait pas pourquoi les options sont écrites dans un fichier temporaire pour le traitement des valeurs des variables d'environnement Option1
, Option2
et Option3
. Et il aurait été bon de voir les lignes qui définissent les variables d'environnement Option1
, Option2
et Option3
pour les valeurs réelles qui leur sont affectées.
Donc je suggère ici un fichier batch qui remplace %20
comme trouvé par exemple dans les fichiers HTML ou les emails par un caractère espace dans toutes les variables d'environnement Option
.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Option1=Calculation%%20One"
set "Option2=Calculation %%%%20Two!"
set "Option3=Any other string"
cls
echo The options before processing:
echo/
set Option
for /F "delims==" %%I in ('set Option 2^>nul') do call :ProcessOption "%%I"
echo/
echo The options after processing:
echo/
set Option
echo/
endlocal
pause
goto :EOF
:ProcessOption
setlocal EnableDelayedExpansion
set "ModifiedOption=!%~1:%%20= !"
endlocal & set "%~1=%ModifiedOption%"
goto :EOF
Il est nécessaire d'utiliser l'expansion retardée sur le remplacement de toutes les occurrences de %20
par un espace parce que sinon interpréteur de commandes de Windows ne sait pas où l'environnement référence variable avec une substitution de chaîne se termine. Remplacer une chaîne avec le signe pourcentage n'est pas possible en utilisant l'expansion immédiate pour cette raison.
La commande set Option
sorties triés par ordre alphabétique toutes les variables de l'environnement à partir de la casse avec la chaîne Option
au format variable=value
comme il peut être vu deux fois sur l'exécution de ce fichier batch.
POUR exécute cette commande dans un processus de commande séparé a commencé en arrière-plan et capture toutes les lignes écrites par commande SET pour gérer STDOUT.
La chaîne 2^>nul
est exécutée finalement comme 2>nul
et redirige le contenu du message d'erreur par la commande SET pour gérer STDERR au dispositif NUL de le supprimer. SET affichera un message d'erreur si aucune variable d'environnement commençant par Option
n'est définie dans l'environnement actuel. Cette condition d'erreur ne se produit pas avec ce fichier batch. Lisez l'article Microsoft sur Using Command Redirection Operators. L'opérateur de redirection >
doit être échappé ici ^
à interpréter d'abord comme caractère littéral lorsque l'interpréteur de commandes de Windows traite le entier pour la ligne de commande avant d'exécuter la commande POUR qui exécute cmd.exe /c set Option 2>nul
en arrière-plan.
POUR traite la sortie capturée de set Option
ligne par ligne et divise chaque ligne vers le haut en sous-chaînes (jetons) en utilisant le signe égal comme délimiteur tel que spécifié à delims==
. La chaîne laissée au premier signe égal sur chaque ligne est affectée à la variable de boucle I
. C'est le nom de la variable d'environnement, c'est-à-direOption1
, Option2
et Option3
pour ce fichier batch.
Pour chaque nom de variable d'environnement OptionX
, le sous-programme ProcessOption
est appelé pour remplacer tous les caractères %20
par un espace.
Voici une solution pour les variables d'environnement avec un ou plusieurs points d'exclamation dans le nom de la variable.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "!Option1!=Calculation%%%%20One"
set "!Option2!=City%%20Country"
set "!Option3!=State%%%%20Country"
set "!Option4!=Any other address/string"
cls
echo The options before processing:
echo/
set !Option
for /F "delims==" %%I in ('set !Option 2^>nul') do call :ProcessOption "%%I"
echo/
echo The options after processing:
echo/
set !Option
echo/
endlocal
pause
goto :EOF
:ProcessOption
call set "ModifiedOption=%%%~1%%"
setlocal EnableDelayedExpansion
set "ModifiedOption=!ModifiedOption:%%%%20= !"
set "ModifiedOption=!ModifiedOption:%%20= !"
endlocal & set "ModifiedOption=%ModifiedOption%"
set "%~1=%ModifiedOption%"
set "ModifiedOption="
goto :EOF
Ce code de lot remplace %20
ET %%20
dans toutes les variables d'environnement commençant par !Option
au nom par un espace par rapport ci-dessus en remplaçant simplement %20
par un espace dans les variables d'environnement en commençant par Option
nom.
Il est bien sûr une mauvaise idée d'utiliser des caractères dans les noms de variables qui ont une signification particulière pour l'interpréteur de commandes Windows comme les caractères &()[]{}^=;!'+,`~|<>%
. C'est possible comme démontré ci-dessus, mais ce n'est certainement pas une bonne idée. Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez les commandes suivantes et lisez attentivement toutes les pages d'aide affichées pour chaque commande.
call /?
cls /?
echo /?
endlocal /?
for /?
goto /?
set /?
setlocal /?
Voir aussi la réponse sur Single line with multiple commands using Windows batch file pour une explication de l'opérateur &
.
Et lisez le sujet du forum DosTips ECHO. FAILS to give text or blank line - Instead use ECHO/ pourquoi il est préférable d'utiliser echo/
au lieu de echo
. pour sortir une ligne vide.
Dans un fichier batch, la norme est de doubler les caractères en tant que caractères d'échappement. Essayez donc de modifier votre script pour lire '%%%% 20' et réessayez. – Compo