2010-12-02 55 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 
) 

這可以工作,[測試空間]的任何實例都將被用戶定義的值替換。

但是,我的問題是批處理文件也是剝離感嘆號(!)標記的實例。因此,例如在XML中也有類似這樣的行:

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

當運行批處理腳本,它與替換上面:

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

即剝離!

我哪裏錯了?有任何想法嗎?

+0

可能重複的[查找字符串並替換批處理文件中的特定字母](http://stackoverflow.com/questions/17085650/find-a-string-and-replace-specific-letters-in-batch-file ) – 2014-12-26 10:00:54

回答

5

接收一條線的方法錯誤set 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

非常感謝傑布,這是完美的作品。天才要比!!! – JamesH 2010-12-08 14:55:54

2

您需要創建空文件entities_1.xml,因爲對於一些模糊的原因>>不會創建cmd作爲外殼。
所以在你的FOR循環之前使用TYPE NUL > entities_1.xml來創建一個零字節的長文件。

+0

也很有用。謝謝你Benoit。 – JamesH 2010-12-08 14:56:18