2

テキストファイルの数の特定の行を変更したいので、次のようにバッチファイルを作成しました。

@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 enabledelayedexpansionandendlocalコマンドはforループに入れられます。そうしないと、特殊文字!が破棄されるためです。

4

1 に答える 1

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 
于 2012-06-09T13:37:00.413 に答える