批处理:在较低的一个中使用upper for loop参数

时间:2016-04-29 15:43:28

标签: batch-file for-loop

我试图运行的命令是:

::%items% is defined elsewhere and is the amount of items per line in the file
    FOR /F "usebackq tokens=1-%items% delims=," %%1 IN (`TYPE %TextFile%`) DO (

        FOR /l %%a in (%items%,-1,1) do (
            set /a "number=%%a"
            echo !number!

:: This is the main command I believe im having issues with
        set word!number!=%%!number!


        echo !word1!
        echo !word2!
        echo !word3!
    )
    set /a "lineused%randomline%=1"
    goto exitloop
)
:exitloop
pause

现在我要做的是设置名为wordX的变量,其中X是令牌的编号。编辑:基本上,尝试使用来自上部的%%变量for循环,其中较低的一个在其中运行。 我可以输入

的所有行
set word1=%%1
set word2=%%2
set word3=%%3

但这会破坏我正在努力构建的多功能系统的目的。 在这种情况下,文本文件的格式(%TextFile%)就是:

line1i1,line1i2
line2i1,line2i2

但我还需要它,例如:

line1i1,line1i2,line1i3,line1i4
line2i1,line2i2,line2i3,line1i4

2 个答案:

答案 0 :(得分:1)

有趣的想法,但这不起作用,因为FOR变量扩展在延迟扩展之前发生。你需要一种方法来获得额外的FOR变量扩展。

您可以调用子例程,然后使用虚拟FOR循环重新建立FOR上下文。只要您处于FOR循环上下文中,FOR变量就是全局范围的。因此,您的子例程可以访问之前定义的FOR变量。

...
...
    FOR /F "tokens=1-%items% delims=," %%1 IN ('TYPE %TextFile%') DO (

        FOR /l %%a in (%items%,-1,1) do call :set %%a

        echo !word1!
        echo !word2!
        echo !word3!
    )
...
...
exit /b

:set
for %%. in (.) do set "word%1=%%%1"
exit /b

上述工作,但我不喜欢它,因为CALL很昂贵(慢)。当您只有几个CALL时,这通常不是问题。但在这种情况下,CALL处于紧密循环中 - 每列一次乘以文件中的行数。哎哟!

如果你真的想要参数化你的SET语句,并且你想要不错的性能,那么你可以定义一个动态的宏#34;。只需将所需命令存储在变量中,然后在循环中执行变量的内容。

另请注意,上述内容仅限9项(如果以0开头而不是1项,则为10项)。如果使用字母和查找字符串,则很容易将支持的项目数扩展到26。

最后,您的动态FOR在一些带括号的块中。据推测,您的ITEMS是在块外定义的,否则%items%无法在FOR / F定义中使用。必须使用常规扩展来扩展SET宏,因此应该在定义ITEMS的同时定义它 - 在外部循环之外。

set /a items=3
::Define SET macro
set "v= ABCDEFGHIJKLMNOPQRSTUVWXYZ"
set "set="
for /l %%N in (1 1 %items%) do set "set=!set!&set "word%%N=%%!v:~%%N,1!""
set "set=!set:~1!"

FOR ... some loop ... DO (
  ...
  ...

  FOR /F "tokens=1-%items% delims=," %%A IN ('TYPE %TextFile%') DO (
    %set%
    echo !word1!
    echo !word2!
    echo !word3!
  )

  ...
  ...
)

如果必须在外部循环中设置ITEMS变量,则必须调出循环以建立内部FOR / F循环。

答案 1 :(得分:0)

请注意,您不需要TYPE来获取文件内容,FOR命令本身可以迭代文件内容

您可以尝试这样的事情:

@echo off
setlocal enabledelayedexpansion

set "TextFile=textfile.txt"
set /a "lineNum=0"
set /a "i=0"
for /f "tokens=*" %%a in (%TextFile%) do (
        set /a lineNum=!line_num! + 1
        set "line=%%a"
        for %%b in ("!line:,=" "!") do (
            set /a "i=!i!+1"
            set /a "wordNum=!lineNum! * !i!
            set "word!wordNum!=%%b"
    )
)
echo !word1!
echo !word2!
echo !word3!

给定一个包含内容的文件:

aaa,bbb,ccc,ddd
eee,fff,ggg,hhh

输出将是:

"aaa"
"bbb"
... and so on

要删除引号,请在%%~b行的内部FOR处使用set "word!wordNum!

另请注意,您甚至不需要定义每行的项目数量!

希望它有所帮助, 干杯!