windows 如何处理命名网络适配器的批处理脚本中的井号?[已关闭]

svmlkihl  于 2023-02-05  发布在  Windows
关注(0)|答案(2)|浏览(130)

16小时前关门了。
Improve this question
此脚本获取设备名称,然后重命名适配器以使用户更容易连接。我尝试了双引号、空格、括号,但没有效果。这是Windows 10 Pro 1607。以管理员身份运行。
我应该如何处理第6行"网络连接"和"2"之间的#和空格?

REM @echo off
SetLOCAL

REM REQUIRED FOR INTERMEDIATE VARIABLES
setlocal EnableDelayedExpansion

REM DEVICE NAMES
set nic_TEST1="Intel(R) Ethernet Connection (7) I219-LM"
set nic_TEST2="Intel(R) I210 Gigabit Network Connection"
set nic_TEST3="Intel(R) I210 Gigabit Network Connection #2"

REM FIND DEVICE INDEX (TEST2)
for /f "tokens=*" %%a in ('route print^|find %nic_TEST2%') do (
    set net_TEST2_line=%%a
    set nic_TEST2_index=!net_TEST2_line:~0,2!
    )

REM FIND INTERFACE NAME (TEST2)
for /f "usebackq tokens=1,5,* skip=3" %%a in (`netsh interface ipv4 show interface`) do (
    if "%%a"=="%nic_TEST2_index%" set nic_TEST2_interface=%%b %%c
    )

REM FIND DEVICE INDEX (TEST1)
for /f "tokens=*" %%a in ('route print^|find %nic_TEST1%') do (
    set net_TEST1_line=%%a
    set nic_TEST1_index=!net_TEST1_line:~0,2!
    )

REM FIND INTERFACE NAME (TEST1)
for /f "usebackq tokens=1,5,* skip=3" %%a in (`netsh interface ipv4 show interface`) do (
    if "%%a"=="%nic_TEST1_index%" set nic_TEST1_interface=%%b %%c
    )

REM FIND DEVICE INDEX (TEST3)
for /f "tokens=*" %%a in ('route print^|find %nic_TEST3%') do (
    set net_TEST3_line=%%a
    set nic_TEST3_index=!net_TEST3_line:~0,2!
    )

REM FIND INTERFACE NAME (TEST3)
for /f "usebackq tokens=1,5,* skip=3" %%a in (`netsh interface ipv4 show interface`) do (
    if "%%a"=="%nic_TEST3_index%" set nic_TEST3_interface=%%b %%c
    )

REM STRIP TRAILING SPACE
for /f "tokens=* delims= " %%a in ('echo %nic_TEST2_interface% ') do set nic_TEST2_interface=%%a
set nic_TEST2_interface=%nic_TEST2_interface:~0,-1%
for /f "tokens=* delims= " %%a in ('echo %nic_TEST1_interface% ') do set nic_TEST1_interface=%%a
set nic_TEST1_interface=%nic_TEST1_interface:~0,-1%
for /f "tokens=* delims= " %%a in ('echo %nic_TEST3_interface% ') do set nic_TEST3_interface=%%a
set nic_TEST3_interface=%nic_TEST3_interface:~0,-1%

REM DELETE SCRIPT IF INTERFACES ARE SET
if "%nic_TEST2_interface%"=="TEST2" (
if "%nic_TEST1_interface%"=="TEST1" (
        if "%nic_TEST3_interface%"=="TEST3" (
        del /q /f %0 & exit
        )
        ) 
        )

REM EXIT IF DEVICE IS NOT PRESENT
if "%nic_TEST2_index%"=="" exit
if "%nic_TEST1_index%"=="" exit
if "%nic_TEST3_index%"=="" exit

REM RENAME INTERFACES
netsh interface set interface name="%nic_TEST2_interface%" newname="TEST2"
netsh interface set interface name="%nic_TEST1_interface%" newname="TEST1"
netsh interface set interface name="%nic_TEST3_interface%" newname="TEST3"

REM RERUN SO SCRIPT CAN SELF-DELETE
%0

我试过各种形式的引号、空格、圆括号和^,我知道剩下的代码都能工作,因为另外两个适配器命名正确。

xbp102n0

xbp102n01#

有一种更简单的方法,你可以用3行代码来完成,而不是80行。

Netsh interface set interface name="TEST1" 
new name="desired name"
Netsh interface set interface name="TEST2" 
new name="desired name"
Netsh interface set interface name="TEST3" 
new name="desired name"
bbmckpt7

bbmckpt72#

它与#无关,但您没有向我们提供来自routenetsh命令的目标数据的示例列表。
使用set "var=value"来设置字符串值--这避免了由尾随空格引起的问题。不要指定"或终止反斜杠或空格。从元素构建路径名--与直觉相反,这可能会使过程更容易。如果使用语法set var="value",那么引号将成为指定值的一部分。
我假设你遵循了这个建议,因为在尴尬的地方处理引用是一场噩梦。
find将同时检测nic_B和nic_c,因为nic_b是nic_c的子字符串
尝试使用|findstr /e /L /c:"%nic_c%",它在/e行尾找到/L文字字符串/C:"this string"
我假设这个字符串出现在行的末尾,因为我的route print产生了非常不同的结果(这就是为什么您需要向我们显示您的结果)。

相关问题