2010-12-02 8 views
2

J'ai un fichier XML et j'ai un fichier batch pour rechercher une chaîne spécifique dans ce fichier, la remplacer par une chaîne définie par l'utilisateur et la sortir dans un nouveau fichier XML:Problème de recherche et de remplacement du fichier de commandes

@echo off > entities_1.xml 
setLocal EnableDelayedExpansion 

if exist entities_1.xml del entities_1.xml 
set /p name= What is the new space NAME? 

for /f "tokens=* delims= " %%G in (entities.xml) do (
set str=%%G 
set str=!str:[Test Space]=[%name%]! 
echo !str! >> entities_1.xml 
) 

Ce travail et toutes les instances de [Test Space] sont remplacés par la valeur définie par l'utilisateur.

Mon problème, cependant, est que le fichier batch supprime AUSSI des instances de points d'exclamation (!). Ainsi, par exemple dans le fichier XML il y a des lignes similaires à ceci:

<property name="title"><![CDATA[TEST2]]></property> 

Lorsque le script batch est exécuté, il remplace le ci-dessus:

<property name="title"><[CDATA[TEST2]]></property> 

à savoir dépouillant le!

Où est-ce que je me trompe? Des idées?

+0

duplication possible de [Rechercher une chaîne et remplacer des lettres spécifiques dans un fichier batch] (http://stackoverflow.com/questions/17085650/find-a-string-and-replace-specific-letters-in-batch-file –

Répondre

5

La mauvaise réception d'une ligne par est impossible si vous définissez str = %% G alors que l'extension retardée est activée. C'est parce que la phase d'expansion retardée est après la phase d'expansion %% v.

Avec l'expansion retardée désactivée, vous avez le problème, que vous ne pouvez pas remplacer la chaîne d'une manière sûre. Vous devez donc basculer l'expansion différée.

@echo off > entities_1.xml 
setLocal DisableDelayedExpansion 

if exist entities_1.xml del entities_1.xml 
set /p name= What is the new space NAME? 

for /f "tokens=* delims= " %%G in (entities.xml) do (
    set str=%%G 
    setLocal EnableDelayedExpansion 
    set str=!str:[Test Space]=[%name%]! 
    >> entities_1.xml echo(!str! 
    endlocal 
) 

En changeant la redirection, vous n'avez pas toujours ajouté un espace.
En utilisant écho (, de sorte que vous obtenez pas écho est sur si le! Str! Est vide.

+0

Merci beaucoup Jeb, ça fonctionne parfaitement. Génious !!! – JamesH

2

Vous devez créer le fichier vide entities_1.xml, parce que, pour une raison obscure >> ne sera pas créer avec cmd comme shell.
Utilisez donc TYPE NUL > entities_1.xml juste avant votre boucle FOR pour créer un fichier long de zéro octet.

+0

Aussi utile. Merci Benoit. – JamesH

Questions connexes