我编写了一个简单的批处理文件来管理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%]=%*"
是否可以使用类似的方法来“填充”我的批处理文件中的“选择网络接口”列表,并使列表中的条目数量与可用的NIC数量相匹配?我希望在多台计算机上使用它,而不必编辑批处理以反映每台计算机上的NIC的名称和数量。
答案 0 :(得分:0)
这应该可以解决问题! -我们在这里做的很简单。根据您的代码段,我对其进行了调整,以显示没有空行的名称。从那里开始,我们使用计数字符串对+1
中的每个结果进行计数。 -使用这个数字,我们可以从中得到一个唯一的字符串!
在示例中:Set "Num!i!=%%B"
-我们将Num
加!i!
(Num1, Num2, Num3, Exc
)等于%%B
(NetConnectionID
)。简单吧! -看到我们要去哪里了吗?
现在我们可以为每个NetConnectionID
分配一个数字和唯一的字符串,我们以Echo !i! - %%B
作为您发布的格式来回显它。对于您的设备或网络上存在的1-Infin
,此列表将以数字NetConnectionID
增长。
示例:
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#
。 -但是我们使用%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
编辑:
感谢您对脚本的反馈,我忘记了何时或如果您选择不在列表中的数字都会出现安全网络(发生错误),它将继续运行脚本。这可能会导致大问题,具体取决于您使用的字符串是否为空。
要解决此问题,我只添加了IF
之后的set /P
语句以查找结果。如果没有找到有效的结果,它将带您回到菜单。
IF /I "!Num%INPUT%!"=="" (
Echo(
Echo ERROR: Number Was Not On The List.
Pause>NUL
goto MenuList
)
要获取有关任何命令的帮助,请执行以下操作:
call /?
set /?
for /?
if /?
find /?
答案 1 :(得分:0)
由于无法访问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]%]!"
注意:我故意不在菜单中包含退出选项