使用 NetConnectionID 名称批量填充选择列表
Use NetConnectionID name to populate selection list in batch
我已经编写了一个简单的批处理文件来管理我 PC 上各种 NIC 的 IP 地址。目前虽然它需要将 NIC 的名称写入批处理文件以便可以选择它们:
ECHO Select Network Interface
ECHO.
ECHO 1 - WiFi
ECHO 2 - LAN 1
ECHO 3 - LAN 2
ECHO 9 - Exit
SET "A="
SET /P A=Set Your Choice And Press Enter:
IF "%A%"=="1" set net_int=WiFi
IF "%A%"=="2" set net_int=LAN 1
IF "%A%"=="3" set net_int=LAN 2
IF "%A%"=="9" EXIT
echo %net_int% selected
我发现以下代码段列出了 PC 上可用的网络连接:
@Echo Off
Set "i=0"
For /F "Skip=1Delims=" %%A In (
'WMIC NIC Get NetConnectionID'
) Do For /F "Delims=" %%B In ("%%A") Do Call :Sub %%B
Set NIC[
Timeout -1
Exit/B
:Sub
Set/A i+=1
Set "NIC[%i%]=%*"
是否可以对我的批处理文件中的 'populate' Select 网络接口列表使用类似的东西,列表中的条目数与可用的 NIC 数相匹配?我希望在多台机器上使用它,而不必编辑批处理以反映每台机器上 NIC 的名称和数量。
这应该可以解决问题! - 我们在这里做的很简单。根据您的代码段,我对其进行了调整以显示没有空行的名称。从那里,我们使用计数字符串来计算 +1
中的每个结果。 - 使用这个数字,我们可以从中创建一个唯一的字符串!
在示例中:Set "Num!i!=%%B"
- 我们将 Num
加上 !i!
(Num1, Num2, Num3, Exc
) 等于 %%B
(NetConnectionID
).简单吧! - 看到我们要把它带到哪里了吗?
现在我们可以为每个 NetConnectionID
分配一个数字和唯一的字符串,我们用 Echo !i! - %%B
作为您发布的格式来回应。对于您的设备或网络上存在的 NetConnectionID
,此列表将随着数字 1-Infin
的增加而增加。
示例:
Select Network Interface
1 - Bluetooth Network Connection
2 - Ethernet
3 - Wi-Fi
4 - VPN - VPN Client
5 - Hamachi
6 - Ethernet 2
7 - VirtualBox Host-Only Network
0 - Exit
Set Your Choice And Press Enter:
由此可见,如果你还没有想通,在用set /P
选择数字时,我们使用set命令将字符串input
设置为Num#
。 - BUT 我们使用 %Input%
来获得唯一的 #
。这将设置 Input=!Num1!, Input=!Num2!, Input=!Num3!, Exc!
.
Set "INPUT=!Num%INPUT%!"
从这里开始,我们只需清理字符串,您就可以开始了!
GetUniqueNetConnectionList.bat:
@ECHO OFF
@setlocal EnableDelayedExpansion
@goto MenuList
:MenuList
cls
Set "INPUT="
Set "i=0"
Echo Select Network Interface
Echo(
Rem | Get NetConnectionID To String
For /F "Tokens=* Skip=1" %%A In ('WMIC NIC Get NetConnectionID') Do (
Rem | Remove Empty Lines
For /F "Tokens=*" %%B In ("%%A") Do (
Rem | Set Strings
Set /A "i+=1"
Rem | Save Variable As String
Set "Num!i!=%%B"
Rem | Print String To Console
Echo !i! - %%B
)
)
Echo 0 - Exit
Echo(
Set /P INPUT=Set Your Choice And Press Enter:
IF /I "!INPUT!"=="0" GOTO :EOF
Rem | Check For Valid Listing
IF /I "!Num%INPUT%!"=="" (
Rem | Number Not Listed!
Echo(
Echo ERROR: Number Was Not On The List.
Pause>NUL
goto MenuList
)
cls
Rem | Set String Based On Number
Set "INPUT=!Num%INPUT%!"
Rem | Remove Spaces From End Of String
for /l %%A in (1,1,100) do (if "!INPUT:~-1!"==" " set INPUT=!INPUT:~0,-1!)
Set "net_int=!INPUT!"
Echo !net_int! Selected
pause
编辑:
感谢对脚本的反馈,我忘记了一个安全网(错误发生),当你选择一个不在列表中的数字时,它会继续 运行 脚本。这可能会导致很大的问题,具体取决于您使用它的原因是字符串将为空。
为了解决这个问题,我只是在 set /P
下方添加了一个 IF
语句来查找结果。如果未找到有效结果,它将带您返回菜单。
IF /I "!Num%INPUT%!"=="" (
Echo(
Echo ERROR: Number Was Not On The List.
Pause>NUL
goto MenuList
)
如需任何命令的帮助,请执行以下操作:
call /?
set /?
for /?
if /?
find /?
- 等等。
我无法测试这个,因为我无法访问 Windows PC,但这是我试过的答案与您发布的代码段不要太相似。
@Echo Off
SetLocal EnableDelayedExpansion
For /F "Delims==" %%A In ('"(Set NIC[) 2>Nul"') Do Set "%%A="
Set "i=0"
For /F "Skip=1 Delims=" %%A In (
'WMIC NIC Where "NetConnectionID Is Not Null" Get NetConnectionID'
) Do For /F "Delims=" %%B In ("%%A") Do Call :Sub %%B
If %i% Equ 1 (Set "NIC[X]=%NIC[1]%") Else Call :Menu
Rem Your commands here
Echo You selected %NIC[X]%
Pause
Exit /B
:Sub
Set /A i+=1
Set "NIC[%i%]=%*"
Exit /B
:Menu
For /L %%A In (1,1,%i%) Do (Echo %%A. !NIC[%%A]!)
Set /P "NIC[X]=Select a network interface from the above list: "
If Not Defined NIC[%NIC[X]%] (ClS & GoTo Menu)
Set "NIC[X]=!NIC[%NIC[X]%]!"
注意:我故意没有在菜单中包含退出选项
我已经编写了一个简单的批处理文件来管理我 PC 上各种 NIC 的 IP 地址。目前虽然它需要将 NIC 的名称写入批处理文件以便可以选择它们:
ECHO Select Network Interface
ECHO.
ECHO 1 - WiFi
ECHO 2 - LAN 1
ECHO 3 - LAN 2
ECHO 9 - Exit
SET "A="
SET /P A=Set Your Choice And Press Enter:
IF "%A%"=="1" set net_int=WiFi
IF "%A%"=="2" set net_int=LAN 1
IF "%A%"=="3" set net_int=LAN 2
IF "%A%"=="9" EXIT
echo %net_int% selected
我发现以下代码段列出了 PC 上可用的网络连接:
@Echo Off
Set "i=0"
For /F "Skip=1Delims=" %%A In (
'WMIC NIC Get NetConnectionID'
) Do For /F "Delims=" %%B In ("%%A") Do Call :Sub %%B
Set NIC[
Timeout -1
Exit/B
:Sub
Set/A i+=1
Set "NIC[%i%]=%*"
是否可以对我的批处理文件中的 'populate' Select 网络接口列表使用类似的东西,列表中的条目数与可用的 NIC 数相匹配?我希望在多台机器上使用它,而不必编辑批处理以反映每台机器上 NIC 的名称和数量。
这应该可以解决问题! - 我们在这里做的很简单。根据您的代码段,我对其进行了调整以显示没有空行的名称。从那里,我们使用计数字符串来计算 +1
中的每个结果。 - 使用这个数字,我们可以从中创建一个唯一的字符串!
在示例中:Set "Num!i!=%%B"
- 我们将 Num
加上 !i!
(Num1, Num2, Num3, Exc
) 等于 %%B
(NetConnectionID
).简单吧! - 看到我们要把它带到哪里了吗?
现在我们可以为每个 NetConnectionID
分配一个数字和唯一的字符串,我们用 Echo !i! - %%B
作为您发布的格式来回应。对于您的设备或网络上存在的 NetConnectionID
,此列表将随着数字 1-Infin
的增加而增加。
示例:
Select Network Interface
1 - Bluetooth Network Connection
2 - Ethernet
3 - Wi-Fi
4 - VPN - VPN Client
5 - Hamachi
6 - Ethernet 2
7 - VirtualBox Host-Only Network
0 - Exit
Set Your Choice And Press Enter:
由此可见,如果你还没有想通,在用set /P
选择数字时,我们使用set命令将字符串input
设置为Num#
。 - BUT 我们使用 %Input%
来获得唯一的 #
。这将设置 Input=!Num1!, Input=!Num2!, Input=!Num3!, Exc!
.
Set "INPUT=!Num%INPUT%!"
从这里开始,我们只需清理字符串,您就可以开始了!
GetUniqueNetConnectionList.bat:
@ECHO OFF
@setlocal EnableDelayedExpansion
@goto MenuList
:MenuList
cls
Set "INPUT="
Set "i=0"
Echo Select Network Interface
Echo(
Rem | Get NetConnectionID To String
For /F "Tokens=* Skip=1" %%A In ('WMIC NIC Get NetConnectionID') Do (
Rem | Remove Empty Lines
For /F "Tokens=*" %%B In ("%%A") Do (
Rem | Set Strings
Set /A "i+=1"
Rem | Save Variable As String
Set "Num!i!=%%B"
Rem | Print String To Console
Echo !i! - %%B
)
)
Echo 0 - Exit
Echo(
Set /P INPUT=Set Your Choice And Press Enter:
IF /I "!INPUT!"=="0" GOTO :EOF
Rem | Check For Valid Listing
IF /I "!Num%INPUT%!"=="" (
Rem | Number Not Listed!
Echo(
Echo ERROR: Number Was Not On The List.
Pause>NUL
goto MenuList
)
cls
Rem | Set String Based On Number
Set "INPUT=!Num%INPUT%!"
Rem | Remove Spaces From End Of String
for /l %%A in (1,1,100) do (if "!INPUT:~-1!"==" " set INPUT=!INPUT:~0,-1!)
Set "net_int=!INPUT!"
Echo !net_int! Selected
pause
编辑:
感谢对脚本的反馈,我忘记了一个安全网(错误发生),当你选择一个不在列表中的数字时,它会继续 运行 脚本。这可能会导致很大的问题,具体取决于您使用它的原因是字符串将为空。
为了解决这个问题,我只是在 set /P
下方添加了一个 IF
语句来查找结果。如果未找到有效结果,它将带您返回菜单。
IF /I "!Num%INPUT%!"=="" (
Echo(
Echo ERROR: Number Was Not On The List.
Pause>NUL
goto MenuList
)
如需任何命令的帮助,请执行以下操作:
call /?
set /?
for /?
if /?
find /?
- 等等。
我无法测试这个,因为我无法访问 Windows PC,但这是我试过的答案与您发布的代码段不要太相似。
@Echo Off
SetLocal EnableDelayedExpansion
For /F "Delims==" %%A In ('"(Set NIC[) 2>Nul"') Do Set "%%A="
Set "i=0"
For /F "Skip=1 Delims=" %%A In (
'WMIC NIC Where "NetConnectionID Is Not Null" Get NetConnectionID'
) Do For /F "Delims=" %%B In ("%%A") Do Call :Sub %%B
If %i% Equ 1 (Set "NIC[X]=%NIC[1]%") Else Call :Menu
Rem Your commands here
Echo You selected %NIC[X]%
Pause
Exit /B
:Sub
Set /A i+=1
Set "NIC[%i%]=%*"
Exit /B
:Menu
For /L %%A In (1,1,%i%) Do (Echo %%A. !NIC[%%A]!)
Set /P "NIC[X]=Select a network interface from the above list: "
If Not Defined NIC[%NIC[X]%] (ClS & GoTo Menu)
Set "NIC[X]=!NIC[%NIC[X]%]!"
注意:我故意没有在菜单中包含退出选项