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