web-dev-qa-db-ja.com

FOR / FループでDOS変数をインクリメントするにはどうすればよいですか?

ファイルからテキスト行を読み取って、カウンターを増分して、最終的にDOSで配列をシミュレートしようとしています。

さらに処理するために、DOS配列にテキスト行を保存できるようにしたいと思います。

私の現在の試みは次のとおりです。

set TEXT_T="myfile.txt"

set /a c=1

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
set /a c=c+1
echo %%i,  %c%
)

ただし、変数cは増加しません。 1のままです。

提案を歓迎します。

ありがとう、マイク

45
Mike

コードスニペットの問題は、変数の展開方法です。通常、変数の展開は、ステートメントが最初に読み取られるときに行われます。あなたの場合、FORループ全体とそのブロックが読み込まれ、ループ変数を除くすべての変数が現在の値に展開されます。

これは、%c%echo %%i, %c%が即座に展開されることを意味するため、実際には各ループの繰り返しでecho %%i, 1として使用されます。

したがって、必要なのは遅延変数の展開です。それに関するいくつかの良い説明を見つけてください ここ

遅延拡張される必要がある変数は、!VARIABLE!ではなく%VARIABLE%で参照されます。ただし、setlocal ENABLEDELAYEDEXPANSIONでこの機能を有効にし、一致するendlocalでリセットする必要があります。

変更したコードは次のようになります。

set TEXT_T="myfile.txt"

set /a c=1

setlocal ENABLEDELAYEDEXPANSION

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
  set /a c=c+1

  echo %%i, !c!
)

endlocal
81
Frank Bollack

ループ内でローカル変数を作成する場合は、bang(!)表記を使用して展開する必要があることを追加します。カウンターベースの出力ファイル名を作成する場合は、上記の https://stackoverflow.com/a/2919699 の例を拡張します

set TEXT_T="myfile.txt"

set /a c=1

setlocal ENABLEDELAYEDEXPANSION

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c=c+1
    set OUTPUT_FILE_NAME=output_!c!.txt
    echo Output file is !OUTPUT_FILE_NAME!
    echo %%i, !c!
)

endlocal
5
curryage

または、遅延を使用せずにこれを行うことができます。

set /a "counter=0"

->ここにforループ

do (
   statement1
   statement2
   call :increaseby1
 )

:increaseby1
set /a "counter+=1"
3
Carlo Ponsones

この単純なコードはどうですか、私とWindows 7で動作します

set cntr=1
:begin
echo %cntr%
set /a cntr=%cntr%+1
if %cntr% EQU 1000 goto end
goto begin

:end
0
Zonnevuur
set TEXT_T="myfile.txt"
set /a c=1

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c+=1
    set OUTPUT_FILE_NAME=output_%c%.txt
    echo Output file is %OUTPUT_FILE_NAME%
    echo %%i, %c%
)
0

Windows 7を使用します。EnableDelayedExpansionを取得できません。 Test1.tstTest2.tstという2つのテストファイルがあります。最初のものだけで何かをしたい。 2つの場所私は '!'値に解決されません。最後のechoはゼロを出力します。ここに私のコードがあります:

set /a count1=0

setlocal EnableDelayedExpansion
for %%x in (*.tst) do (

  if !count1! GTR 0 goto :getout

  call :addit

  type %%x

  ren %%x *.xxx

)
@echo Almost done...
goto :alldone

:addit
set /a count1=%count1% + 1
@echo %count1%
goto :eof

:getout
@echo Getting out...
@echo !count!

:alldone
endlocal
0
user3461349