0

我正在尝试重命名 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 进行重命名。

4

2 回答 2

2

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

set local ENABLEDELAYEDEXPANSION

...应该这样写:

setlocal ENABLEDELAYEDEXPANSION

否则,“setlocal”命令会变成“set”命令,并且不会以相同的方式工作。

在这一行:

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

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

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

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

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

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

for %%i in (!idx!) do echo !names[%%i]!
于 2017-03-30T01:04:29.143 回答
1

我最终想出了一种方法来做到这一点,但它只在尝试索引到一个数字数组时才有效。这是我用的

@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
)
于 2017-04-14T18:38:54.100 回答