gpt4 book ai didi

arrays - 变量作为 for 循环中的标记

转载 作者:行者123 更新时间:2023-12-02 09:33:10 26 4
gpt4 key购买 nike

我正在尝试制作一个批处理文件,该文件循环遍历包含如下数字的数组:1 2 3 4 5。在循环的第一次迭代中,我喜欢选择标记 1 和 2。在第二次中选择标记 2 和 3,在第三次中选择标记 3 和 4,依此类推。

我确实认为我应该使用!在我用作标记的变量第一和第二中。就像在第一个 FOR/F 中一样,但是当我这样做时,我得到:!first!”这里不是预期的。

如果我使用%,它就不会计数。除了变量标记之外,一切正常。有人知道怎么做吗?任何帮助或建议都非常感谢。这是我苦苦挣扎的部分:

setlocal EnableDelayedExpansion
set first=1
set second=2
set N=4
set output="1 2 3 4 5"
set output=%output:"=%

for /L %%a in (1,1,%N%) do (
if !counter! equ active (
set /a first+=1
set /a second+=1
)
FOR /F "tokens=!first!" %%a IN ("%output%") DO (
set nr1=%%a
)
FOR /F "tokens=%second%" %%a IN ("%output%") DO (
set nr2=%%a
)

echo nr1 var: !nr1!
echo nr2 var: !nr2!
echo counter f: !first!
echo counter s: !second!
set counter=active
)

最佳答案

您不能在for/F 的选项字符串中使用延迟扩展变量。您也不能为此使用其他 for 变量。但您可以正常(立即)使用扩展变量。例如,您还可以使用像 %1 这样的参数引用。

因此,解决您的问题的一个不错的方法是将 for/F 循环放在子例程中,并在主程序中使用 call 并延迟展开变量作为参数,如下所示:

@echo off
setlocal EnableDelayedExpansion
set /A first=1
set /A second=2
set /A N=4
set "output=1 2 3 4 5"

set "counter="
for /L %%a in (1,1,%N%) do (
if defined counter (
set /A first+=1
set /A second+=1
)

call :SUB !first! !second!

echo nr1 var: !nr1!
echo nr2 var: !nr2!
echo counter f: !first!
echo counter s: !second!
set "counter=active"
)
endlocal
exit /B

:SUB val_token1 val_token2
for /F "tokens=%~1,%~2" %%a in ("%output%") do (
if %~1 LSS %~2 (
set "nr1=%%a"
set "nr2=%%b"
) else if %~1 GTR %~2 (
set "nr1=%%b"
set "nr2=%%a"
) else (
set "nr1=%%a"
set "nr2=%%a"
)
)
exit /B

由于您要从同一字符串中提取标记,因此我将两个 for/F 循环合并为一个循环。子例程 :SUB 中的 for/F 循环中的 if block 是为了防止第二个 token 编号并不总是更大比第一个。但如果可以保证这一点,for/F 循环只需包含 set "nr1=%%a"set "nr2=%%b".

关于arrays - 变量作为 for 循环中的标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38982872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com