2011-06-17 260 views
3
for /F "skip=n tokens=3 delims= " %%i in (myfile.txt) do echo %%i 

是否有可能爲skip=n ...要像skip=%test% ...其中%test%有一個整數值的變量?批處理腳本「FOR/F ......」

所以我試圖添加一列數據,並在該文件中該表的位置由字符串給出。

對於如:

$startTable 

0 1 4 

1 2 4 

2 1 4 

$endTable 

所以這個表的位置是通過與$ startTable的行數給出。我將這個值存儲在一個變量(!test!)中,所以我需要skip =!test!然後我開始添加第三列直到我點擊$ endTable。

當我嘗試;

for /f "skip=!test! tokens=3 delims= " %%j in (!INPUTFILE!) do (
echo %%j 
if %%j == "$endTable" goto :break 
set /a test2+=%%j 
) 
:break 

我得到以下錯誤;

!test! tokens=3 delims= " was unexpected at this time. 

-GK

回答

3

for不喜歡在參數中使用延遲擴展語法。這應該沒問題,因爲你不需要它。使用標準的%wrap變量 - 這就是Michael和Jebego的例子所使用的。

如果你真的想使用延遲擴展版本,你需要一個臨時變量來做到這一點:

set for_parameters="skip=!test! tokens=3 delims= " 
for /f %for_parameters% %%j in (!INPUTFILE!) do (echo %%j 

編輯:這就是我跑,試圖貼近您的原始參數名。我改變了輸入以顯示%j正在更新以及哪些行被解析。

stackoverflow_input.txt

$startTable 

0 1 3 

1 2 4 

2 1 5 

$endTable 

stackoverflow1.bat

@setlocal enabledelayedexpansion 
@echo off 
set INPUTFILE=stackoverflow_input.txt 
set test=3 
set test2=0 
set for_parameters="skip=!test! tokens=3 delims= " 
for /f %for_parameters% %%j in (!INPUTFILE!) do (
echo %%j 
if %%j == "#endTable" goto :break 
set /a test2+=%%j 
) 
:break 
echo Sum: %test2% 
endlocal 

stackoverflow2.bat

@setlocal enabledelayedexpansion 
@echo off 
set INPUTFILE=stackoverflow_input.txt 
set test=3 
set test2=0 
for /f "skip=%test% tokens=3 delims= " %%j in (!INPUTFILE!) do (
echo %%j 
if %%j == "#endTable" goto :break 
set /a test2+=%%j 
) 
:break 
echo Sum: %test2% 
endlocal 

結果(驗證同在Win 7,服務器2008 R2,Server 2003中,和Win XP SP3):

D:\temp>stackoverflow1.bat 
4 
5 
Sum: 9 

D:\temp>stackoverflow2.bat 
4 
5 
Sum: 9 

如果命令擴展名是殘疾人,你會得到改爲:/f was unexpected at this time.

+0

我試過這個,出於某種原因,for語句無法處理%for_parameters%變量。對待這個就好像參數不存在一樣。 –

+0

嘗試在設置後放置回顯以確保其按照您的預期工作。另外,確保for_parameters和後面的等號之間沒有空格。 (或者在您的原始代碼中使用%test%代替!test !. :)) –

+0

當我在該集合後回顯時,它爲我提供了「for_parameters」的正確值,即「skip = 100 tokens = 3 delims =」'在哪裏,'!test!= 100',但它無法工作。此外,我嘗試使用'%test%'而不是for_parameters,它不工作,抱怨說''tokens = 3 delims =「在這個時候意外。」 –

1

是。

set num=2 
for /F "skip=%num% tokens=3 delims= " %%i in (myfile.txt) do echo %%i 

這將跳過前兩行。你可能只是試圖添加變量!

+0

請檢查修訂說明。 –

1

是的。這將回顯test.txt的第4行和後續行

set sk=3 
for /f "skip=%sk% delims=" %%L in (test.txt) do ( 
    echo %%L 
    ) 
+0

請檢查修改後的說明。 –