Создание пакетного файла для идентификации активного интернет-соединения - PullRequest
2 голосов
/ 25 марта 2011

Я пытаюсь написать командный файл, который позволит пользователю выбрать активное интернет-соединение, если в списке, созданном командой netsh, более одного, а затем изменить настройки DNS.

Однако я не могу понять, как использовать команду выбора, когда число параметров известно до тех пор, пока сценарий не будет выполнен. Без использования массивов я попытался создать строковую переменную 'choices', чтобы она содержала строку, представляющую числовые варианты выбора, и передавала ее команде выбора, но я не могу заставить ее работать. Я не могу избавиться от ощущения, что должен быть намного более простой способ сделать это, но мое исследование не показывает мне это. Любая помощь будет принята с благодарностью.

@echo off
setlocal
Set active=0
Set choices=1
set ConnnectedNet=
FOR /F "tokens=2,3* " %%j in ('netsh interface show interface ^| find "Connected"') do Set /A active+=1
FOR /L %%G IN (2,1,%active%) do (set choices=%choices%%%G)
if %active% lss 2 goto :single
if %active% gtr 1 goto :multiple
:single
FOR /F "tokens=2,3* " %%j in ('netsh interface show interface ^| find "Connected"') do set ConnnectedNet=%%l
netsh interface IPv4 set dnsserver "%ConnnectedNet%" static 0.0.0.0 both
goto :eof
:multiple
echo You have more than one active interface. Please select the interface which you are using to connect to the Internet
FOR /F "tokens=2,3* " %%j in ('netsh interface show interface ^| find "Connected"') do echo %%l
CHOICE /C:%choices% /N /T:1,10

1 Ответ

2 голосов
/ 26 марта 2011

Проблема не в команде выбора, сборка строки выбора завершается неудачей.
Иногда может помочь простое echo on.

set choices=1
...
FOR /L %%G IN (2,1,%active%) do (set choices=%choices%%%G)

Это не удается, поскольку set choices=%choices% раскрывается только один раз до цикла, поэтому вы получаете set choices=1%%G.

Вместо этого вы можете использовать задержанное расширение

setlocal EnableDelayedExpansion  
FOR /L %%G IN (2,1,%active%) do (set choices=!choices!%%G)

или двойное расширение / расширение вызова

FOR /L %%G IN (2,1,%active%) do (call set choices=%%choices%%%%G)

Задержанное расширение (частично) объясняется с помощью set /?

...