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
答案 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
)