2014-05-06 54 views
1

我正在編輯XML文件,大約前10行是註釋。而對於XML註釋的形式如何使用EnabledDelayedExapnsion輸出感嘆號?

<!-- COMMENT HERE --> 

但是,當使用我的代碼它不會輸出!標記,它將xml中的註釋擰緊。我知道ENABLEDELAYEDEXPANSION正在這樣做,因爲它認爲感嘆號正在擴展一個變量。我怎麼能得到這個工作?

這是我下面

setlocal ENABLEDELAYEDEXPANSION 

set line=0 

FOR /f "usebackqdelims=" %%a in ("%filename2%") do (
    set /a line = !line!+1 
    if !line!==39 (echo REPLACED TEXT39>>%tempfile% 
)else if(!line!==45 (echo REPLACED TEXT45>>%tempfile% 
)else (echo %%a>>%tempfile% 
)) 

EDIT1代碼基本上什麼是應該做的是輸出的每一行,因爲它是,除非是行39或45。它的工作原理,除!評論中的標記不會被輸出,並且他們不再是評論。

EDIT2

set line=0 

FOR /f "usebackqdelims=" %%a in ("%filename2%") do (
setlocal ENABLEDELAYEDEXPANSION 
    set /a !line! +=1 
echo !line! 
    if !line!==39 (
echo REPLACED TEXT39>>%tempfile% 
endlocal 
)else if !line!==45 (
echo REPLACED TEXT45>>%tempfile% 
endlocal 
)else (
endlocal 
setlocal DISABLEDELAYEDEXPANSION 
echo %%a>>%tempfile% 
endlocal 
)) 

這是我一直在使用最新的代碼。它工作得最好,但現在問題是變量「行」沒有得到更新。我有一種感覺,那是因爲「終點」。唯一的問題是我需要「endlocal」,否則我得到一個錯誤

達到最大setlocal遞歸級別。

問題是,我需要在enableddelayedexpansion和disabledelayedexpansion之間切換,以便我的感嘆號正確顯示。但要做到這一點,我需要跟上我認爲正在搞亂我的線路變量的「本地」呼叫。有什麼想法嗎?

+2

'其他if'不是命令,你需要空間ALA')其他(' – foxidrive

+0

那好吧,我可以解決這部分後來... –

+1

'如果(!行!== 45'是非法的,它應該是'if!line!== 45' – jeb

回答

5

您不能以這種方式輸出感嘆號。

感嘆號是%%a內容的一部分,但啓用延遲擴展後,您將無法訪問它,因爲它將在%%a被隱藏後解析。

因此,您需要禁用全部或暫時的延遲擴展。

一種臨時禁用它

setlocal ENABLEDELAYEDEXPANSION 

set line=0 

FOR /f "usebackqdelims=" %%a in ("%filename2%") do (
    set /a line = !line!+1 
    if !line!==39 (
     echo REPLACED TEXT39>>%tempfile% 
    ) else if !line!==45 (
     echo REPLACED TEXT45>>%tempfile% 
    ) else (
     setlocal DisableDelayedExpansion 
     echo %%a>>%tempfile% 
     endlocal 
    ) 
) 

或者你不使用它在所有樣品中,那麼你只需要得到if line=42部分工作。
這使用了以0爲模的事實將產生一個錯誤(這是由2>nul抑制)和變量保持不變,在這種情況下,它們保持未定義。

setlocal DisableDelayedExpansion 
set line=0 

FOR /f "usebackqdelims=" %%a in ("%filename2%") do (
    set /a line+=1 
    set "notLine39=" 
    set /a "notLine39=1%%(line-39)" 2>nul 
    set "notLine45=" 
    set /a "notLine45=1%%(line-45)" 2>nul 

    if not defined line39 (
     echo REPLACED TEXT39>>%tempfile% 
    ) else if not defined line45 (
     echo REPLACED TEXT45>>%tempfile% 
    ) else (
     setlocal DisableDelayedExpansion 
     echo %%a>>%tempfile% 
     endlocal 
    ) 
) 

編輯:增加內容,說明你的改變的問題
它使用的觸發延遲擴展TECHNIC,在SO: Batch files: How to read a file?
訣竅描述transfering %%atext時,則切換到enabledDE是在disabledDelayedExpansion和能夠使用擴展語法。
但是在下一個循環開始之前請不要忘記endlocal

setlocal DisableDelayedExpansion 
set line=0 

FOR /f "usebackqdelims=" %%a in ("%filename2%") do (
    set /a line+=1 
    set "text=%%a" 
    setlocal EnableDelayedExpansion 
    if !line!==39 (
     echo REPLACED TEXT39>>%tempfile% 
    ) else if !line!==45 (
     echo REPLACED TEXT45>>%tempfile% 
    ) else (
     echo %%a>>%tempfile% 
    ) 
    endlocal 
) 
+0

好吧,這個新的問題是,line39將始終未定義,並且它將始終打印出「REPLACED TEXT39」,我不知道「set/a」notLine39 = 1 %%%%(line-39)「2> nul」這行代碼正在工作,但是如果它到達該行,則將其設置爲null?如果是,那麼也許我們最初設置的內容爲notLine39? 「如果未定義的line39」只有在o時纔會成立第39行? –

+0

經過一個簡短的簡單測試後,迴應該行,似乎它不會遞增... –

+1

@JeremyRowler - notLineNN的定義中存在一個錯誤:太多百分比。所有固定通過在兩個地方刪除兩個百分點。答案已更新。 – dbenham