ファイルからテキスト行を読み取って、カウンターを増分して、最終的に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のままです。
提案を歓迎します。
ありがとう、マイク
コードスニペットの問題は、変数の展開方法です。通常、変数の展開は、ステートメントが最初に読み取られるときに行われます。あなたの場合、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
ループ内でローカル変数を作成する場合は、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
または、遅延を使用せずにこれを行うことができます。
set /a "counter=0"
->ここにforループ
do (
statement1
statement2
call :increaseby1
)
:increaseby1
set /a "counter+=1"
この単純なコードはどうですか、私とWindows 7で動作します
set cntr=1
:begin
echo %cntr%
set /a cntr=%cntr%+1
if %cntr% EQU 1000 goto end
goto begin
:end
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%
)
Windows 7を使用します。EnableDelayedExpansion
を取得できません。 Test1.tst
とTest2.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