0

搜索了这个网站和其他网站 - 不高兴。

:: first for loop
for /L %%x in (1,1,2) do (
generic-executable.output > grab1-%%x.txt

:: second, nested for loop
for /f "delims=" %%i in (grab1-%%x.txt) do (set grab1=%%i)
echo variable string is %grab1%%x%

generic-executable.output > grab2-%%x.txt
for /f "delims=" %%i in (grab2-%%x.txt) do (set grab2=%%i)
echo variable string is %grab2%%x%
)

尝试运行嵌套的 for 循环

1) 将数据写入文件

2)从文件中获取数据并将其保存到另一个变量。

结束变量的名称应该是每个 for 循环的串联(即,grab1-1、2-1、1-2、2-2)。

将数据保存到变量中是没有问题的,格式化变量以调用数据 IS。

我很可能在连接变量的格式中遗漏了一些东西。我试过 single ', double ", ^, !, one %, two %, 反斜杠, ACK!! ...我得到的最接近的是

echo %grab1-%%x

给了:

%grab1-1

我很感激你能提供的任何提示。

谢谢,戴夫

4

1 回答 1

2

您遇到了批处理新手的经典绊脚石:您不能在循环内(括号内)设置变量,然后%var%在同一个循环内访问该值。整个循环(带括号的代码块)一次解析,并%var%在解析时展开。因此,您会看到var循环执行之前的值。

解决方案是在脚本顶部附近启用延迟扩展setlocal enableDelayedExpansion,然后使用延迟扩展 as 扩展变量!var!。延迟扩展意味着值在运行时扩展 - 正是您想要的。

我相信这就是你想要达到的目标

setlocal enableDelayedExpansion
for /L %%x in (1,1,2) do (

  genericOutput1.exe > grab1-%%x.txt
  for /f "delims=" %%i in (grab1-%%x.txt) do set "grab1-%%x=%%i"
  echo grab1-%%x variable string is !grab1-%%x!

  genericOutput2.exe > grab2-%%x.txt
  for /f "delims=" %%i in (grab2-%%x.txt) do set "grab2-%%x=%%i"
  echo grab2-%%x variable string is !grab2-%%x!
)

::List all of the grab variable defined
set grab

您不需要将可执行文件的输出保存到文件中。(当然,除非这是您的要求)。您可以使用 FOR /F 直接处理输出。FOR 命令有许多看起来几乎相同但行为却截然不同的变体。此变体使用单引号使 FOR /F 处理命令。

setlocal enableDelayedExpansion
for /L %%x in (1,1,2) do (

  for /f "delims=" %%i in ('genericOutput1.exe') do set "grab1-%%x=%%i"
  echo grab1-%%x variable string is !grab1-%%x!

  for /f "delims=" %%i in ('genericOutput1.exe') do set "grab2-%%x=%%i"
  echo grab2-%%x variable string is !grab2-%%x!
)

::List all of the grab variable defined
set grab

请注意, FOR /F 将迭代每一行(无论是来自文本文件还是来自命令输出)。您的算法将只保存和打印最后一行的内容 - 每个连续的行将覆盖前一行的值。

于 2012-06-27T21:35:13.233 回答