2017-09-26 10 views
0

J'ai un cas d'utilisation où je veux remplacer %% 20 qui fait partie d'une chaîne par exemple: "Calculation %% 20One". Je veux remplacer cela par "Calcul Un".Remplacer %% 20 dans une chaîne en utilisant le script batch Windows

Ce où je suis coincé:

@echo off 
setlocal enableextensions disabledelayedexpansion 

>"temp" (
    echo !Option1! 
    echo !Option2! 
    echo !Option3! 
) 

set "pattern=%%20" 

for /f "usebackq delims=" %%a in ("temp") do (
    echo data: %%a 

    set "line=%%a" 
    setlocal enabledelayedexpansion 
    if "!line:%pattern%=!"=="!line!" (
     set string=!Option1! 
     set string2=%!string1!:%%20= % 
    ) else (
     set string2=%%a 
    ) 
    endlocal 
) 

del /q tempFile 

Quelqu'un peut-il me s'il vous plaît aider? J'ai un programme qui est une combinaison de batch et de python.

Merci

+0

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

Répondre

0

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.