2012-06-09 85 views
2

我想修改的文本文件數的幾個特定的​​行,我寫了一個批處理文件,如下所示:Windows批處理:延遲擴展在for循環中

@echo off 
set n=0 
set n1=10 
set n2=40 
cd.>output.txt 

for /f "delims=" %%i in ('findstr /n .* test.txt') do (
set "var=%%i" 
setlocal enabledelayedexpansion 
set /a n=!n!+1 
echo.!n! 
set var=!var:*:=! 
rem if !n!=%n1% ... 
rem if !n!=%n2% ... 
(echo.!var!)>>output.txt 
endlocal 
) 
start output.txt 

然而,這並不爲工作預期。
經過一些測試,我認爲!n!擴展通常不會延遲。這很奇怪,因爲!var!擴展通常延遲。

順便說一句,在setlocal enabledelayedexpansionendlocal命令放在for循環,因爲否則的特殊字符!將被放棄。

+2

如果你解釋你正在做什麼以及什麼不工作,你獲得幫助的機會將大大提高。對於不工作的部分,您應該解釋預期結果並描述您所看到的內容。 – dbenham

+0

我沒有嘗試分析你的代碼,但是不應該使用'set/a n + = 1'而不是'set/an =!n!+ 1' –

+0

@ panda-34 - 我更喜歡你的建議語法,但都應該工作。 – dbenham

回答

3

我想這個問題你看到的是n永遠不會增加。

但是這不是延遲擴展的問題,它是循環內setlocal/endlocal塊的效果。
由於panda-34提到您應該使用set/a的擴展語法並將該語句移動到setlocal/endlocal塊之外。

@echo off 
set n=0 
set n1=10 
set n2=40 

(
    for /f "delims=" %%i in ('findstr /n .* test.txt') do (
    set "var=%%i" 
    set /a n+=1 
    setlocal enabledelayedexpansion 
    echo !n! 
    set var=!var:*:=! 
    rem if !n!=%n1% ... 
    rem if !n!=%n2% ... 
    (echo(!var!) 
    endlocal 
) 
) >output.txt 
start output.txt 
+0

是的,問題與您所說的一樣,但是您的代碼不起作用。 – user1446072

+0

@ user1446072:請問這個代碼不工作的方式是什麼? –

+2

@ user1446072 - 正如我在之前的問題中所暗示的那樣:如果我們不知道應該做什麼,那麼任何人都很難「修復」你的代碼。對於jeb來說,找到一個重要的問題(+1)是一個很好的發現,但是代碼的預期行爲仍然是一個謎。 – dbenham