2012-06-09 3 views
2

Я хочу изменить несколько конкретных строк числа текстовых файлов, и я написал пакетный файл следующим образом:Windows, партия: задержка расширения в цикле

@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 enabledelayedexpansion и endlocal помещаются в петлю 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 - Как я подразумевал в своем предыдущем вопросительном комментарии: «Кто-нибудь может« исправить »ваш код, если мы не знаем, что он должен делать. Это был хороший улов на стороне Джеба, чтобы найти одну важную проблему (+1), но ожидаемое поведение вашего кода остается загадкой. – dbenham

Смежные вопросы