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

时间:2016-03-17 14:31:04

标签: batch-file

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

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

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

虽然我使用delayedexpansion几乎完成了所有可能的方法,但我无法让批处理文件将mess.cnt.name视为随每个循环递增的变量。

以下是输出示例:

C:\Users\admin\Desktop>test1.bat

C:\Users\admin\Desktop>set cnt=1

C:\Users\admin\Desktop>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:\Users\admin\Desktop>(
setlocal enabledelayedexpansion
  set "mess.!cnt!.name=AirLink USB Ethernet/RNDIS"
  endlocal
  set /a cnt+=1
)

C:\Users\admin\Desktop>(
  setlocal enabledelayedexpansion
  set "mess.!cnt!.name=LAN9500 USB 2.0 to Ethernet 10/100 Adapter"
  endlocal
  set /a cnt+=1
)

C:\Users\admin\Desktop>(
  setlocal enabledelayedexpansion
  set "mess.!cnt!.name=Intel(R) 82579LM Gigabit Network Connection"
  endlocal
  set /a cnt+=1
)

C:\Users\admin\Desktop>echo mess.0.name
mess.0.name

C:\Users\admin\Desktop>for /L %t in (1 1 4) do (
echo mess.%t.name
echo "Intel(R) 82579LM Gigabit Network Connection"
)
C:\Users\admin\Desktop>(
echo mess.1.name
echo "Intel(R) 82579LM Gigabit Network Connection"
)
mess.1.name
"Intel(R) 82579LM Gigabit Network Connection"

C:\Users\admin\Desktop>(
echo mess.2.name
 echo "Intel(R) 82579LM Gigabit Network Connection"
)
mess.2.name
"Intel(R) 82579LM Gigabit Network Connection"

C:\Users\admin\Desktop>(
echo mess.3.name
 echo "Intel(R) 82579LM Gigabit Network Connection"
)
mess.3.name
"Intel(R) 82579LM Gigabit Network Connection"

C:\Users\admin\Desktop>(
echo mess.4.name
 echo "Intel(R) 82579LM Gigabit Network Connection"
)
mess.4.name
"Intel(R) 82579LM Gigabit Network Connection"

C:\Users\admin\Desktop>pause
Press any key to continue . . .

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

维克多

1 个答案:

答案 0 :(得分:0)

@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 ting ...