2010-05-26 125 views
38

我想從文件中讀取文本行,並增加一個計數器,這樣我最終可以在DOS中模擬一個數組。如何在FOR/F循環中增加一個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.

建議歡迎。

謝謝,邁克

回答

72

你的代碼片段的問題是變量擴展的方式。變量擴展通常在首次讀取語句時完成。在你的情況下,整個FOR循環及其塊被讀取,除了循環變量之外的所有變量都被擴展爲它們的當前值。

這意味着在您的echo %%i, %c%立即擴展,因此實際上在每個循環迭代中用作echo %%i, 1

所以,你需要的是延遲變量擴展。找到一些關於它的好解釋here

變量應該是延遲擴展與!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 
+0

超酷!這正是我所需要的。 我相應地修改了腳本,它現在按我的預期運行。 感謝您的快速回答。 - Mike – Mike 2010-05-27 18:11:56

+3

@Mike:如果它解決了您的問題,您應該將此答案標記爲已接受! – Sk8erPeter 2011-12-03 02:17:10

+0

@Frank Bollack。非常感謝這個解釋,我學到了一些新東西。我用這種技術來回答這個問題:http://serverfault.com/questions/664202/batch-file-that-kills-a-certain-process。它的工作原理,但我不知道我應該如何引用變量_outside_ FOR循環。它是否有所作爲,使用!c!或%c%,在那之後如果我有FOR? – pgr 2015-02-02 10:52:38

3

我想在你創建局部變量的循環中,他們需要使用爆炸符號作爲擴大到添加的情況下(!)好。擴展的例子在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 
2

或者你也可以做到這一點,而無需使用延遲。

set /a "counter=0" 

- >您的for循環這裏

do (
    statement1 
    statement2 
    call :increaseby1 
) 

:increaseby1 
set /a "counter+=1" 
0
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。我只想做第一件事。這兩個地方我'!'沒有解決的價值。最後的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 
-1

什麼這個簡單的代碼,對我的作品,並在Windows 7

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

:end