Batch file 为什么';当一个语句使用另一个for循环变量打印时,它是否可以使用for循环变量打印?
所以,我在处理一些代码时遇到了一个奇怪的问题。我在一个名为“tests”的文件中有一个字符串,即“1:23195068336843541324”。我想要一个for循环来查找第3个字符,并在此基础上查找一定数量的以第7个字符开头的字符。在这种情况下,我想找到第7和第8个字符。所以我提出了这个嵌套for循环:Batch file 为什么';当一个语句使用另一个for循环变量打印时,它是否可以使用for循环变量打印?,batch-file,Batch File,所以,我在处理一些代码时遇到了一个奇怪的问题。我在一个名为“tests”的文件中有一个字符串,即“1:23195068336843541324”。我想要一个for循环来查找第3个字符,并在此基础上查找一定数量的以第7个字符开头的字符。在这种情况下,我想找到第7和第8个字符。所以我提出了这个嵌套for循环: @ECHO off SETLOCAL EnableDelayedExpansion FOR /L %%i IN (1,1,5) DO ( FOR /F %%j IN ('FINDSTR
@ECHO off
SETLOCAL EnableDelayedExpansion
FOR /L %%i IN (1,1,5) DO (
FOR /F %%j IN ('FINDSTR /C:"%%i:" tests.txt') DO (
SET PH=%%j
SET mon=!PH:~2,1!
ECHO !mon!
SET test%%i=!PH:~6,%mon%!
ECHO !test1!))
ECHO语句纯粹用于调试,因此我可以看到设置为什么
但是每次它输出ECHO时都是关闭的
,因为test1
从未设置过。我用这个循环重新创建了它:
SETLOCAL EnableDelayedExpansion
SET test=123
SET number=2
FOR /L %%i IN (1,1,5) DO (
SET t%%i=!test:~1,%number%!
ECHO !t1!)
而且效果很好。如果我在第一个循环中为
mon
输入一个数字,它也可以正常工作。我做错了什么?谢谢 我想这就是你想要做的。我真的不明白你为什么要做你现在正在做的事情,这是帮助别人编写代码的一半
@ECHO off
SETLOCAL EnableDelayedExpansion
FOR /L %%j IN (1,1,5) DO (
FOR /F %%i IN ('FINDSTR /C:"%%j:" tests.txt') DO (
SET PH=%%i
SET mon=!PH:~2,1!
ECHO mon=!mon!
FOR /F "delims=" %%G IN ("!mon!") do SET test%%j=!PH:~6,%%G!
ECHO test%%j=!test%%j!
)
)
按字母顺序使用变量。
PH
必须在mon
之前设置,因为mon
取决于PH
。不管怎样,字母顺序都不重要。您似乎对延迟扩展的工作原理感到困惑。我对如何以不同的顺序使用这些变量感到困惑,因为它们相互依赖,并且语法要求PH
在mon
之前。举一个这样的例子可以帮助我澄清我的困惑。我想你不理解我之前关于按字母顺序使用FOR
变量的评论。您在评论中列出了您的环境变量。那当然没关系。但在某些情况下,如果您在外循环中使用%%j
并在内环中使用%%i
,则如果您在内环中使用标记选项进行操作,内环可能会破坏外环%%j
。我的用例非常模糊,难以描述,但是你成功地为它创建了一个解决方案。非常感谢。唯一的问题是我不理解代码。添加第三个for循环有什么作用?为什么这能解决我的问题?归根结底都是因为延迟扩张。不能在延迟扩展中使用延迟扩展。无法使用:%mon%
,因为它需要延迟扩展才能使用。您也不能这样做:SET test%%i=!博士:~6,!周一代码>。因此,您需要某种方法来扩展变量,以便将其用作子字符串长度。由于mon
只包含一个简单的整数,您可以通过将最里面的for/F
循环替换为标准的for
循环来简化方法,如下所示:for%%G in(“!mon!”)请设置test%%j=!PH:~6,%%~G代码>..@aschipfl,你说得对。我完全无视我的常规最佳实践,即何时使用FOR
和FOR/F
。英雄联盟