2014-01-16 64 views
0

目前,我有一個script,做以下的(!):批處理文件:讀取XML刪除感嘆句CDATA上閱讀

  1. 看在一個特定的文件夾
  2. 解壓所有的* .zip文件
  3. 讀取有四列的特定CSV file(OLDID,使用oldName,NEWID NEWNAME)
  4. 遞歸查找該文件夾中的所有* .xml文件(sample.xml
  5. 通過循環的* .xml FIL ES,創建副本(原件李明博&潛在修改BAK)
  6. 取代OLDID,使用oldName與NEWID,NEWNAME
  7. 如果修改,寫XML,刪除原始文件,移動李明博原始。

最後一步是我的問題。目前,當批處理文件讀取XML文件時,它會丟失感嘆號。出口前,採樣線是: <url><![CDATA[pdf/Post-Rec_Job Model Training.pdf]]></url> 結果 <url><[CDATA[pdf/Post-Rec_Job Model Training.pdf]]></url>

我怎樣才能保持感嘆號?

+1

請勿使用延遲擴展。 – foxidrive

回答

2

必須確保延遲擴展當展開對可能含有!文字變量未啓用。您可以修改:replaceCourseInfo例程以在循環內開啓和關閉延遲擴展,而不是在例程頂部打開它。

我同意foxidrive,我不知道如何使用修改的變量,所以我把它剝離了。

:replaceCourseInfo 
    @echo off 
    setlocal 

    set INTEXTFILE=%~1 
    set OUTTEXTFILE=%~1 
    copy %INTEXTFILE% %INTEXTFILE%.bak 
    copy %INTEXTFILE% %INTEXTFILE%.original.bak 
    set BAKFILE=%~1.bak 

    if exist "%~1.bak" del /F /Q "%~1.bak" 

    REM Walk through XML Lines 
    REM @todo Need to prevent losing ! in [!CDATA[ 
    for /F "delims=" %%U in (%~1) do (
     set LINE=%%U 

     setlocal enabledelayedexpansion 

     if not "!LINE!" == "!LINE:%~2=!" (
      set LINE=!LINE:%~2=%~3! 
     ) 
     >> "%BAKFILE%" echo.!LINE! 

     endlocal 
    ) 

    REM If modified, delete original, copy modified bak as new original 
    if NOT "%~2"=="%~3" (
     del /F /Q %~1 
     copy %BAKFILE% %~1 
    ) 

goto:eof 

我曾經使用FOR/F循環來修改文本文件,但它通常可能很複雜,以獲得所需的結果。我寫了foxidrive所說的REPL.BAT腳本,現在我幾乎總是使用REPL.BAT而不是FOR/F循環來修改文件。 REPL.BAT更簡單快捷。

+0

我在我的Gist上添加了[repl.bat](https://gist.github.com/wpsmith/8450004)。 dbenham會讓你有任何機會讓腳本使用repl。蝙蝠,因爲我不能'輸入「%〜1」| REPL「%〜2」「%〜3」>>「%BAKFILE%」'從foxidrive上班? –

+0

它需要'L'文字選項來阻止字符被解釋爲正則表達式元字符。 'REPL「%〜2」「%〜3」L' – dbenham

0

問題是delayed expansion - 這可以解決。

您正在使用以下代碼 - 顯然modified變量未被使用。

您的代碼似乎與%~3簡單地更換%~2是否存在字符串中%~2,這可以通過REPL.BAT或dbenham或SEDVBS search and replace feature來完成。

REM Walk through XML Lines 
REM @todo Need to prevent losing ! in [!CDATA[ 
for /F "delims=" %%U in (%~1) do (
    set LINE=%%U 

    if not "!LINE!" == "!LINE:%~2=!" (
     set LINE=!LINE:%~2=%~3! 
     set modified=!string:%~2=%~3! 

    ) 
    >> "%BAKFILE%" echo. LINE! 
) 

這裏是REPL.BAT解決方法,以取代上面的代碼:

type "%~1" | REPL "%~2" "%~3" L >> "%BAKFILE%" 
+0

REPL.BAT解決方案需要'L'文字選項:'type「%〜1」| REPL「%〜2」「%〜3」L >>「%BAKEFILE%」' – dbenham

+0

@dbenham謝謝Dave。我忽略了文字選項。非常感激。 – foxidrive