批处理脚本“for / f ...”

时间:2011-06-17 19:36:53

标签: batch-file cmd

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

skip=n ...是否可以成为像skip=%test% ...这样的变量,其中%test%有一个整数值?

所以我试图添加一列数据,文件中该表的位置由一个字符串给出。

例如:

$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 个答案:

答案 0 :(得分:3)

for不喜欢在参数内部采用延迟扩展语法。这应该没问题,因为你不需要它。使用标准的%wrapped变量 - 这就是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,Server 2008R2,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.

答案 1 :(得分:1)

是。

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

这将跳过前两行。您可能刚刚尝试添加变量!

答案 2 :(得分:1)

是。这将回显test.txt的第4行和后续行

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