Используйте имя NetConnectionID для заполнения списка выбора в пакете - PullRequest
0 голосов
/ 10 января 2019

Я написал простой пакетный файл для управления IP-адресами различных сетевых карт на моих компьютерах. В настоящее время, хотя для этого нужно, чтобы имена сетевых карт были записаны в командный файл, чтобы их можно было выбрать:

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

Я нашел следующий фрагмент списка сетевых подключений, доступных на ПК:

@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%]=%*"

Можно ли использовать что-то подобное для «заполнения» списка «Выбор сетевого интерфейса» в моем пакетном файле, причем количество записей в списке соответствует количеству доступных сетевых карт? Я хочу использовать это на нескольких машинах, не редактируя пакет для отображения имен и количества сетевых карт на каждой машине.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Я не смог проверить это, , поскольку у меня нет доступа к ПК с Windows , но вот ответ, который я постарался сохранить не слишком отличающимся от фрагмента, который вы ' ve отправил.

@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]%]!"

Примечание: я специально не включил в меню опцию выхода

0 голосов
/ 11 января 2019

Это должно сработать! - То, что мы здесь делаем, довольно просто. Основываясь на вашем фрагменте, я настроил его так, чтобы в нем отображались имена без пустых строк. Оттуда мы используем строку подсчета для подсчета каждого результата в +1. - Используя это число, мы можем сделать из него уникальную строку!

В примере: Set "Num!i!=%%B" - Мы принимаем Num Plus !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

EDIT:

Благодаря отзывам о скрипте я забыл о безопасной сети (случаются ошибки), когда или если вы выберете номер, которого нет в списке, он продолжит и запустит скрипт. Это может вызвать большие проблемы, в зависимости от того, что вы используете, чтобы строка была пустой.

Чтобы исправить это, я просто добавил оператор 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 /?
  • И так далее.
...