使用递增变量的批处理文件 FOR 循环



我创建了一个批处理文件,该文件应该将三个附加的接口描述分配为自定义变量,然后打印每个变量。 最终,我计划使用这些变量根据输出本身配置接口,而不是打印,但现在我很高兴看到它正确分配变量。

这就是我试图解决这个问题的方式:

set cnt=1
for /f "tokens=12,13*" %%f in ('ipconfig /all^|findstr "Description"') do (
  setlocal enabledelayedexpansion
  set "mess.!cnt!.name=%%h"
  endlocal
  set /a cnt+=1
  )
echo mess.0.name
for /l %%t in (1,1,%cnt%) do (
  echo mess.%%t.name
  echo "%mess.0.name%"
  )
pause

尽管我已经使用延迟扩展完成了几乎所有可以想象的方法,但我无法让批处理文件将 mess.cnt.name 视为随每个循环递增的变量。

下面是输出的示例:

C:UsersadminDesktop>test1.bat
C:UsersadminDesktop>set cnt=1
C:UsersadminDesktop>for /F "tokens=12,13*" %f in('ipconfig /all|findstr "Des
cription"') do (
setlocal enabledelayedexpansion
  set "mess.!cnt!.name=%h"
  endlocal
  set /a cnt+=1
)
C:UsersadminDesktop>(
setlocal enabledelayedexpansion
  set "mess.!cnt!.name=AirLink USB Ethernet/RNDIS"
  endlocal
  set /a cnt+=1
)
C:UsersadminDesktop>(
  setlocal enabledelayedexpansion
  set "mess.!cnt!.name=LAN9500 USB 2.0 to Ethernet 10/100 Adapter"
  endlocal
  set /a cnt+=1
)
C:UsersadminDesktop>(
  setlocal enabledelayedexpansion
  set "mess.!cnt!.name=Intel(R) 82579LM Gigabit Network Connection"
  endlocal
  set /a cnt+=1
)
C:UsersadminDesktop>echo mess.0.name
mess.0.name
C:UsersadminDesktop>for /L %t in (1 1 4) do (
echo mess.%t.name
echo "Intel(R) 82579LM Gigabit Network Connection"
)
C:UsersadminDesktop>(
echo mess.1.name
echo "Intel(R) 82579LM Gigabit Network Connection"
)
mess.1.name
"Intel(R) 82579LM Gigabit Network Connection"
C:UsersadminDesktop>(
echo mess.2.name
 echo "Intel(R) 82579LM Gigabit Network Connection"
)
mess.2.name
"Intel(R) 82579LM Gigabit Network Connection"
C:UsersadminDesktop>(
echo mess.3.name
 echo "Intel(R) 82579LM Gigabit Network Connection"
)
mess.3.name
"Intel(R) 82579LM Gigabit Network Connection"
C:UsersadminDesktop>(
echo mess.4.name
 echo "Intel(R) 82579LM Gigabit Network Connection"
)
mess.4.name
"Intel(R) 82579LM Gigabit Network Connection"
C:UsersadminDesktop>pause
Press any key to continue . . .

对此的任何帮助将不胜感激。 几天来,我一直在用头撞墙。

胜利者

@ECHO OFF
SETLOCAL
set cnt=0
for /f "tokens=1,14*" %%f in ('ipconfig /all^|findstr "Description"^|find /n /v ""') do (
  set "mess%%fname=%%h"
  set /a cnt+=1
  )
echo %mess[1]name%
for /l %%t in (1,1,%cnt%) do (
  CALL echo mess[%%t]name=%%mess[%%t]name%%
  )
SET mess
GOTO :EOF

从本质上讲,endlocal放弃了mess.?.name的设置,经典的治疗方法在代码块中不起作用。

同样,报告循环(我添加了另一种方式)需要设置delayedexpansion显示,或使用我显示的语法。

现在 - 如果您在整个例程周围只放置一个setlocal/endlocal并且没有在代码块中切换,它可能会更容易工作。

或者 - 你可以调用一个内部子例程来执行set

...

最新更新