2010-03-23 11 views
2

Je dois remplacer du texte dans un fichier JNLP à l'aide d'un fichier de commandes DOS pour le régler sur la machine locale.Echappement d'un signe égal dans la commande de remplacement de chaîne de traitement par lots DOS

Le problème est que le motif de recherche contient un signe égal qui gâche le remplacement de chaîne dans le fichier séquentiel.

Je veux remplacer la ligne,

<j2se version="1.5" initial-heap-size="100M" max-heap-size="100M"/> 

avec des paramètres spécifiques pour les tailles de tas initial et max.

Par exemple au moment où j'ai,

for /f "tokens=* delims=" %%a in (%filePath%agility.jnlp) do (
set str=%%a 
set str=!str:initial-heap-size="100M"=initial-heap-size="%min%M"! 
echo !str!>>%filePath%new.jnlp) 

mais les = dans le modèle de recherche est en cours de lecture dans le cadre de la commande de remplacement. Comment puis-je échapper le signe égal afin qu'il soit traité comme du texte?

+0

Urgh. Le traitement XML avec les fichiers de traitement par lots échouera quand même. Vous vous mettez dans un monde de douleur là pour le '<' and '>' seul. – Joey

+0

Publication croisée au super utilisateur: http: // superuser.com/questions/123137 –

Répondre

-3

Voici une solution alternative. Si vous pouvez vous permettre de télécharger des outils GNU, vous pouvez utiliser sed:

C:\test>set a=200 
C:\test>sed -i.bak "s/^\(.*initial-heap-size=\"\).*\(max.*\)/\1%a%\"\2/" file 
+0

On dirait la façon la plus propre de le faire sans avoir à installer le cgiwin complet –

1

La meilleure solution est de télécharger et installer Cygwin ou GNUWin32 mais, si vous êtes vraiment limité au processeur de commande standard, il peut obtenir un peu désordonné.

Cette méthode n'est pas la plus rapide au monde, mais elle est au moins fonctionnelle. Ce fichier de commandes traite chaque ligne un caractère à la fois, en traitant spécialement le cas où vous trouvez la strophe que vous recherchez.

@echo off 
set init=50M 
set max=75M 
setlocal enableextensions enabledelayedexpansion 
for /f "tokens=* delims=" %%a in (agility.jnlp) do (
    set str1=%%a 
    call :morph 
    echo !str2!>>agility_new.jnlp 
    echo !str2! 
) 
endlocal 
goto :eof 

:morph 
    set str2= 
:morph1 
    if not "x!str1!"=="x" (
     if "!str1:~0,18!"=="initial-heap-size=" (
      set str2=!str2!initial-heap-size="!init!" 
      set str1=!str1:~24! 
      goto :morph1 
     ) 
     if "!str1:~0,14!"=="max-heap-size=" (
      set str2=!str2!max-heap-size="!max!" 
      set str1=!str1:~20! 
      goto :morph1 
     ) 
     set str2=!str2!!str1:~0,1! 
     set str1=!str1:~1! 
     goto :morph1 
    ) 
    goto :eof 

Avec le fichier d'entrée:

<j2se version="1.5" initial-heap-size="100M" max-heap-size="100M"/> 
next line 
=== 

vous vous retrouvez avec:

<j2se version="1.5" initial-heap-size="50M" max-heap-size="75M"/> 
next line 
=== 
1

On ne peut pas simplement remplacer (une sous-chaîne avec) un signe égal, sans division (pour -statement avec "delims==") ou recadrage ...

Mais peut-être que vous pourriez aller pour ce plus simple mais plus co approche nfusing, en utilisant la déclaration suivante dans votre boucle for:

set str=!str:"100M" max-heap-size="%min%M" max-heap-size! 

Il combine juste la chaîne à remplacer par ce qui vient après au lieu de ce qui vient avant, ce qui évite tout remplacement égal signe tout à fait.

0

Si vous pouvez transmettre les arguments comme autre chose, tels que des doubles traits de soulignement, vous pouvez les parcourir et les convertir en '=' dans le fichier de commandes.

@rem Replace __ with = in batch files. 
@rem This works around the lack of equals signs in args 
@rem args contains full args string with substitutions in place 

setlocal enabledelayedexpansion 

:argloop 
if "%~1" NEQ "" (

set str=%~1 
set out=!str:__==! 
set %~1=!out! 
set args=!args!!out! 

SHIFT 
goto :argloop 
) 

@rem Can now run program on a line on its own with just %args% 

Source: https://github.com/mlabbe/batchargs

Questions connexes