使用NetConnectionID名称批量填充选择列表

时间:2019-01-10 17:02:35

标签: batch-file wmi

我编写了一个简单的批处理文件来管理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的名称和数量。

2 个答案:

答案 0 :(得分:0)

这应该可以解决问题! -我们在这里做的很简单。根据您的代码段,我对其进行了调整,以显示没有空行的名称。从那里开始,我们使用计数字符串对+1中的每个结果进行计数。 -使用这个数字,我们可以从中得到一个唯一的字符串!

在示例中:Set "Num!i!=%%B"-我们将Num!i!Num1, Num2, Num3, Exc)等于%%BNetConnectionID)。简单吧! -看到我们要去哪里了吗?

现在我们可以为每个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]%]!"

注意:我故意不在菜单中包含退出选项