2010-12-02 20 views
2

XMLファイルがあり、そのファイル内の特定の文字列を検索し、そのファイルをユーザーが定義した文字列に置き換えて、新しいXMLファイルに出力するバッチファイルがあります。検索の問題とバッチファイルの置換

@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 
) 

[テストスペース]のすべてのインスタンスは、ユーザーが定義した値に置き換えられます。

しかし、私の問題は、バッチファイルが感嘆符(!)マークのインスタンスを削除してしまうことです。

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

バッチスクリプトが実行されると、それはして上記を交換されています:

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

すなわちだから、例えばXMLでは、このような行があります!を取り除く!

どこが間違っていますか?何か案は?

+0

[文字列を見つけ、バッチファイル内の特定の文字を置換する]の複製が可能です。(http://stackoverflow.com/questions/17085650/find-a-string-and-replace-specific-letters-in-batch-file ) –

答えて

5

によって遅延受信が有効になっている間に、str = %% Gという行を受信するのは間違った方法です。
遅延拡張フェーズは%% v拡張フェーズの後にあるためです。

遅延拡張が無効になっていると、文字列を安全な方法で置き換えることができないという問題が発生します。 遅延拡張を切り替える必要があります。

@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 
) 

リダイレクトを切り替えるため、常にスペースが追加されませんでした。あなたはSTR!空である!場合ないエコーがにあり得るので
エコー(を使用した。

+0

多くのありがとうJeb、それは完璧に動作します。 Genious !!! – JamesH

2

いくつかのあいまいな理由>>のためにそれを作成しませんので、あなたは、空のファイルentities_1.xmlを作成する必要がありますシェルとしてのcmd。
FORループの直前にTYPE NUL > entities_1.xmlを使用して、ゼロバイトの長いファイルを作成します。

+0

便利です。 Benoitありがとう。 – JamesH