如何在批处理文件中使用数组?

时间:2017-03-29 19:40:26

标签: batch-file delayedvariableexpansion

我正在尝试重命名PC上的NIC名称。它有很多NIC(它们是虚拟的)。我可以得到他们的名字

for /f "tokens=2 delems==" %%A in ('wmic nic where "Description like 'foo'" get netconnection id /value') do (
 echo %%A
)

我想在该循环中使用netsh来重命名它们。不幸的是,目标名称不是简单的递增数字。所以我做了

set names[0]=name1
set names[1]=name two
set names[2]=name test
set local ENABLEDELAYEDEXPANSION
set /a idx=0
for /f "tokens=2 delems==" %%A in ('wmic nic where "Description like 'foo'" get netconnectionid /value') do (
 echo names[!idx!]
 set /a idx=!idx!+1
)

此输出

names[0]
names[1]
names[2]

但如果我尝试

set names[0]=name1
set names[1]=name two
set names[2]=name test
set local ENABLEDELAYEDEXPANSION
set /a idx=0
for /f "tokens=2 delems==" %%A in ('wmic nic where "Description like 'foo'" get netconnectionid /value') do (
 echo %names[!idx!]%
 set /a idx=!idx!+1
)

我只是得到垃圾输出。有什么方法可以将上一个示例中生成的字符串作为变量进行评估?然后我可以将它传递给netsh进行重命名。

2 个答案:

答案 0 :(得分:1)

首先,您的代码有几个错误。这一行:

set local ENABLEDELAYEDEXPANSION

......应该这样写:

setlocal ENABLEDELAYEDEXPANSION

否则" setlocal"命令成为" set"一个,不要以同样的方式工作。

在这一行:

for /f "tokens=2 delems==" %%A in (. . .

...必须写出选项" delims ==" (NOT" delems =="),但在这种情况下,FOR命令会发出错误。

修复这些错误后,您应该使用该方法访问this answer中完整描述的数组元素,因此我在此复制相关部分:

  

要在FOR / IF内部索引更改时获取元素的值,   将元素用双百分号括起来并在命令前面   与call

call echo %%names[!idx!]%%
  

实现上一个过程的另一种方法是使用额外的   FOR命令用于更改索引的延迟扩展   等效可更换参数,然后使用延迟扩展   对于数组元素。此方法比以前的CALL运行得更快:

for %%i in (!idx!) do echo !names[%%i]!

答案 1 :(得分:0)

我最终找到了一种方法来做到这一点,但只有在尝试索引数字数组时才有效。这就是我用过的东西

@ECHO OFF
set names[1]=101
set names[2]=102
set names[3]=103

setlocal ENABLEDELAYEDEXPANSION

set /a idx=1
for /L %%A in (1,1,3) do (
 set /a foo = names[!idx!] #This is the key, for some reason, an intermediate variable is required.
 echo !foo!
 set /a idx=!idx!+1
)