определить основной шлюз для выбраннго адаптера
Несколько сетевых адаптеров, настройки получают по dhcp.
Нужно брать текущий шлюз для одного из адаптеров, и использовать его дальше в скрипте.
Примерно так:
Код:
Получить шлюз для "ethernet адаптер1"
route add 0.0.0.0 mask 0.0.0.0 'шлюз для "ethernet адаптер1"'
|
neth1, парсить вывод вот этой команды?
netsh interface ip show route
Готового батника не предложу, извините.
|
'interface' в данном случае имя интерфейса?
Как его узнать?
Код:
netsh 'Подключение по локальной сети - Ethernet адаптер' ip show route
не сработало.
Код:
Команда 'Подключение по локальной сети - Ethernet адаптер' ip show route не найдена.
Где посмотреть рабочие примеры парсинга?
|
neth1, извиняюсь, не то написал.
Вот:
netsh interface ip show addresses
Выведет конфиг для всех интерфейсов.
netsh interface ip show addresses name="Имя_интерфейса"
Выведет конфиг для нужного.
Впрочем, то же самое выведет и ipconfig.
|
Код:
netsh interface ip show addresses
Команда interface ip show addresses не найдена.
А что на счет парсинга?
Не представляю, как это реализуется средствами cmd.
|
Цитата:
Цитата neth1
Команда interface ip show addresses не найдена. »
|
Вы бы тогда озвучили среду исполнения.
|
win xp.
Помогите пожалуйста спарсить шлюз из ipconfig, кто может.
Я буду очень долго разбираться.
|
Странно, но не работает:
Код:
@echo off
for /f "tokens=7 delims=:" %%a in ('ipconfig /all ^| findstr "шлюз.*"') do (
if not defined gateway set gateway=%%a
)
echo gateway - %gateway%
|
а так?
Код:
@echo off
setlocal enabledelayedexpansion
for /f "usebackq tokens=1-2 delims=:" %%i in (`ipconfig ^| find "Основной шлюз"`) do echo.%%j
|
Работает.
У меня несколько адаптеров, шлюз нужен только для одного.
Как из %%j выбрать нужную строку?
|
Откуда ж нам знать, по каким критериям Вы выбираете потребный. Озвучьте.
|
Можно по названию сетевого подключения или просто первый, второй или третий шлюз. Они всегда выдаются в одном порядке.
Конечно лучше по названию сетевого подключения.
|
Цитата:
Цитата neth1
по названию сетевого подключения или просто первый »
|
Код:
@echo off
set "na1="
for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^(NetConnectionStatus^="2"^) get NetConnectionID /value^|find "="') do (
set "na=%%a"
if not defined na1 set "na1=%%a"
)
echo Первое имя сетевого подключения - %na1%
echo Последнее имя сетевого подключения - %na%
pause>nul
надеюсь разберетесь как подставить в поиск парсера
И да, это если все всегда включено и подключено каждый раз идентично, если нет, понятно что имя первого займет другое, если сегодня первый отдыхает.
|
Проблема не в том, чтобы спарсить сетевые подключения, а в том чтобы поставить нужное в поиск парсера.
У меня слишком низкий скилл, знаю что хочу сделать, но не вижу реализацию:(
|
Если поизвращаться с парсингом ipconfig /all, то вывести нужный шлюз, например первого подключенного адаптера можно так:
Код:
@echo off
set "na="& set "shl="
for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^(NetConnectionStatus^="2"^) get NetConnectionID /value^|find "="') do if not defined na set "na=%%a"
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
pause
|
Конечно так было бы повеселее, но видимо на вашей системе netsh не работает
Код:
@echo off
for /f "tokens=2 delims=:" %%a in ('netsh interface ip show addresses name^="Имя подключения"^|find "Основной шлюз"') do set "shl=%%a"
echo %shl: =%
pause
|
На моей системе первый вариант также не работает:
Код:
Не удается получить доступ к файлу C:\Documents and Settings\comp_name\+
Почему может не работать netsh?
Он есть.
Код:
netsh>help
Применимы следующие команды:
Команды в этом контексте:
.. - Переход на один контекстный уровень вверх.
? - Отображение списка команд.
abort - Отмена изменений, сделанных в автономном режиме.
add - Добавление элемента конфигурации в список элементов.
alias - Добавление псевдонима.
bridge - Изменения в контексте 'netsh bridge'.
bye - Выход из программы.
commit - Применение изменений, сделанных в автономном режиме.
delete - Удаление элемента конфигурации из списка элементов.
diag - Изменения в контексте 'netsh diag'.
dump - Отображение сценария конфигурации.
exec - Запуск файла сценария.
exit - Выход из программы.
firewall - Изменения в контексте 'netsh firewall'.
help - Отображение списка команд.
interface - Изменения в контексте 'netsh interface'.
lan - Изменения в контексте 'netsh lan'.
nap - Изменения в контексте 'netsh nap'.
offline - Переход в автономный режим.
online - Переход в оперативный режим.
popd - Получение контекста из стека.
pushd - Помещение текущего контекста в стек.
quit - Выход из программы.
ras - Изменения в контексте 'netsh ras'.
routing - Изменения в контексте 'netsh routing'.
set - Обновление параметров конфигурации.
show - Отображение информации.
unalias - Удаление псевдонима.
winsock - Изменения в контексте 'netsh winsock'.
Доступны следующие дочерние контексты:
bridge diag firewall interface lan nap ras routing winsock
Цитата:
Цитата alpap
Конечно так было бы повеселее, но видимо на вашей системе netsh не работает
Код: Выделить весь код
@echo off
for /f "tokens=2 delims=:" %%a in ('netsh interface ip show addresses name^="Имя подключения"^|find "Основной шлюз"') do set "shl=%%a"
echo %shl: =%
pause »
|
Это отрабатывает, но "shl" пустая.
|
Во-первых сюда написать имя, например: "Подключение по локальной сети", или какое там у вас
Во-вторых, значения шлюза может и не быть на определенном адаптере
наберите в командной строке: ipconfig /all>"C:\file.txt" и посмотрите какие имена сетевых подключений, у кого есть Основной шлюз и какой у кого нет, скопируйте имя подключения для которого надо выводить значение шлюза, если оно есть как таковое, конечно
код сохраняйте в кодировке 866!
|
Цитата:
Цитата alpap
Во-первых сюда написать имя, например: "Подключение по локальной сети", или какое там у вас
Во-вторых, значения шлюза может и не быть на определенном адаптере
наберите в командной строке: ipconfig /all>"C:\file.txt" и посмотрите какие имена сетевых подключений, у кого есть Основной шлюз и какой у кого нет, скопируйте имя подключения для которого надо выводить значение шлюза, если оно есть как таковое, конечно
код сохраняйте в кодировке 866! »
|
Именно так все и делал.
Код:
C:\test.bat
=
Для продолжения нажмите любую клавишу . . .
|
Давайте чтобы я не ругался, показывать то что вы делали
1. Вывод этого: ipconfig /all>"C:\file.txt" (можете затереть цифры значений или изменить)
2. этот код
Код:
@echo on
for /f "tokens=2 delims=:" %%a in ('netsh interface ip show addresses name^="Имя подключения"^|find "Основной шлюз"') do set "shl=%%a"
echo %shl: =%
pause
где вместо Имя подключения стоит именно то что у вас, вернее именно тот код как есть который вы запускаете
3. скриншот окна cmd после запуска
|
Код:
for /F "tokens=2 delims=:" %a in ('netsh inte
rface ip show addresses name="Подключение по локальной сети"|find "Основной шлюз
"') do set "shl=%a"
C:\Documents and Settings\COMP_NAME>echo =
=
C:\Documents and Settings\COMP_NAME>pause
Для продолжения нажмите любую клавишу . . .
Код:
Настройка протокола IP для Windows
Имя компьютера . . . . . . . . . : name
Основной DNS-суффикс . . . . . . :
Тип узла. . . . . . . . . . . . . : неизвестный
IP-маршрутизация включена . . . . : нет
WINS-прокси включен . . . . . . . : нет
Подключение по локальной сети - Ethernet адаптер:
DNS-суффикс этого подключения . . :
Описание . . . . . . . . . . . . : TAP-Win32 Adapter V9
Физический адрес. . . . . . . . . : здесь_мак
Dhcp включен. . . . . . . . . . . : да
Автонастройка включена . . . . . : да
IP-адрес . . . . . . . . . . . . : здесь_ип
Маска подсети . . . . . . . . . . : здесь_маска_подсети
Основной шлюз . . . . . . . . . . : здесь_основной_шлюз
DHCP-сервер . . . . . . . . . . . : здесь_DHCP-сервер
DNS-серверы . . . . . . . . . . . : здесь_DNS-серверы
NetBIOS через TCP/IP. . . . . . . : отключен
Аренда получена . . . . . . . . . : 9 апреля 2017 г. 16:11:48
Аренда истекает . . . . . . . . . : 9 апреля 2018 г. 16:11:48
Подключение по локальной сети 7 - Ethernet адаптер:
DNS-суффикс этого подключения . . :
Описание . . . . . . . . . . . . : LAN
Физический адрес. . . . . . . . . : здесь_мак
Dhcp включен. . . . . . . . . . . : да
Автонастройка включена . . . . . : да
IP-адрес . . . . . . . . . . . . : здесь_ип
Маска подсети . . . . . . . . . . : здесь_маска_подсети
Основной шлюз . . . . . . . . . . : здесь_основной_шлюз
DHCP-сервер . . . . . . . . . . . : здесь_DHCP-сервер
DNS-серверы . . . . . . . . . . . : здесь_DNS-серверы
NetBIOS через TCP/IP. . . . . . . : отключен
Аренда получена . . . . . . . . . : 9 апреля 2017 г. 16:11:48
Аренда истекает . . . . . . . . . : 10 апреля 2017 г. 16:11:48
|
так ведь у ТС WinXp, а там с netsh не все так хорошо...
|
neth1, код точно сохранен в кодировке 866? Также код из п15 должен работать в кодировке 866.
а каков вывод команды: netsh interface ip show addresses name="Подключение по локальной сети"
|
Кодировка 866.
Команда interface ip show addresses "name=Подключение по локальной сети" не найд
ена.
Странно, что это не работает. "show addresses" присутствует в help'е к netsh. Другие show отрабатывают нормально.
|
ну, а это? Там без netsh, wmic идет в поставке XP, если не почикано
Цитата:
Цитата alpap
Также код из п15 должен работать в кодировке 866 »
|
кстати так здесь, записано или именно так и запускалась, если да, пропущено netsh вначале строки
|
Запускалось именно
Код:
netsh interface ip show addresses name="Подключение по локальной сети"
Ошибка
Код:
Команда interface ip show addresses "name=Подключение по локальной сети" не найд
ена.
Запускал в консоли netsh и делал пошагово:
Код:
netsh>interface>ip>show addresses name="Подключение по локальной сети"
Результат не изменился.
Код:
netsh interface ip>show config name="Подключение по локальной сети"
работает.
Код:
@echo off
set "na="& set "shl="
for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^(NetConnectionStatus^="2"^) get NetConnectionID /value^|find "="') do if not defined na set "na=%%a"
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
pause
Не работает
Код:
Не удается получить доступ к файлу C:\Documents and Settings\comp_name\+
|
эта команда выдает список адаптеров?
Код:
wmic path Win32_networkadapter get name
|
иначе в вашем случае только так, без выбора, сугубо по имени и разбирая ipconfig:
Код:
@echo off
set "na=Подключение по локальной сети"
set "shl="
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
pause
не забываем - кодировка 866!
|
Цитата:
Цитата alpap
Код:
wmic path Win32_networkadapter get name
»
|
Выдает. Все адаптеры, включая отключенные.
Цитата:
Цитата alpap
Код:
@echo off set "na=Подключение по локальной сети" set "shl=" for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a" for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a" echo %shl: =% pause
»
|
Код:
Не удается получить доступ к файлу C:\Documents and Settings\comp_name\+
=
Для продолжения нажмите любую клавишу . . .
|
neth1,
покажите скриншот окна после выполнения кода:
Код:
@echo on
set "na=Подключение по локальной сети"
set "shl="
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
pause
и скриншот этого же кода, записанного в bat файл в открытом виде файла, естественно
|
Все, я понял. Не стоило использовать notepad++.
Не знаю, что с ним не так. Если редактировать в блокноте, работает.
|
neth1,
чего, notepad++ неплохой редактор, но я лично пользуюсь AkelPad и кстати не только для удобства в настройках надо выставить перенос по строкам, возможно и к notepad++ это относится, ну и нужных плагинов включить для удобства, например подсветка кода в AkelPad мне очень нравиться, причем можно самому допилить что я успешно и сделал.
|
Цитата:
Цитата alpap
не только для удобства в настройках »
|
В нём и сохранять в разных кодировках можно (например, в 866, как нужно здесь).
|
Я не знаю в чем проблема с notepad++. Сохранял в 866.
Теперь проблема с использованием полученного адреса шлюза.
Как записать %shl: =% в "route add"?
Безрезультатно погуглил и поэксперементировал с кавычками, все время выдает "неверный адрес шлюза".
|
Цитата:
Цитата neth1
Как записать %shl: =% в "route add" »
|
в "route add" это куда, вы хоть поясняйте прозрачно, вставить в какой-то код?
а в каком случае верный? Если ручками прописывать - не ругается?
|
Вот так вырисовывается:
Код:
@echo off
set "na=openvpn"
set "shl="
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
set "na=ethernet"
set "shl="
for /f "delims=[]" %%b in ('ipconfig /all^|find /n "%nb%"') do set "ns=%%b"
for /f "tokens=2 delims=:" %%b in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shb=%%b"
echo %shb: =%
route delete 0.0.0.0 mask 0.0.0.0
route add -p %shb: =% mask 255.255.255.255 %shl: =%
route add 0.0.0.0 mask 0.0.0.0 %shl: =%
pause
Если адреса шлюзов вводить ручками, все работает.
|
Цитата:
Цитата neth1
set "na=openvpn"
set "shl=" »
|
Код:
REM Присвоить переменной na значение openvpn
set na=openvpn
REM Сбросить (удалить) переменную shl
set shl=
(без кавычек; после знака равенства — ничего).
Цитата:
Цитата neth1
echo %shb: =%
..
route add -p %shb: =% mask 255.255.255.255 %shl: =% »
|
Код:
REM Вывести переменную shb с её значением
REM (после имени переменной — ничего)
set shb
REM Но можно и в форме
REM echo %shb%
REM — т.е. только её значение
REM
REM Добавить постоянный маршрут с использованием значений двух переменных
route add -p %shb% mask 255.255.255.255 %shl%
Ну и ещё есть минимум одна строка с неправильной (тот же принцип) работой с переменными.
|
mwz, а что не так с кавычками в set?
|
Цитата:
Цитата Iska
а что не так с кавычками в set? »
|
Да вроде не по феншую... И при команде "Help set" в Win-7 не показывает возможности использования кавычек — т.е. не документировано.
Но может и отстал от жизни.
PS
А, увидел:
При использовании любых логических или двоичных операторов необходимо
заключить строку выражения в кавычки. Любые нечисловые строки в выражении
рассматриваются как имена переменных среды, значения которых преобразуются
в числовой вид перед использованием. Если переменная с указанным именем
не определена в системе, вместо нее подставляется нулевое значение.
|
Рабочий вариант скрипта:
Код:
set na=openvpn
set shl=
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%na%"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +%ns%^|find "Основной шлюз"') do if not defined shl set "shl=%%a"
echo %shl: =%
set na=ethernet
set vhb=
for /f "delims=[]" %%b in ('ipconfig /all^|find /n "%nb%"') do set "nv=%%b"
for /f "tokens=2 delims=:" %%b in ('ipconfig /all^|more +%nv%^|find "Основной шлюз"') do if not defined shl set "vhb=%%b"
echo %vhb: =%
route delete 0.0.0.0 mask 0.0.0.0
route add -p %vhb% mask 255.255.255.255 %shl%
route add 0.0.0.0 mask 0.0.0.0 %shl%
pause
Траффик не будет идти напрямую в случае дисконнекта openvpn.
Спасибо всем за помощь.
|
можно тогда и покороче:
Код:
@echo off
setlocal enabledelayedexpansion
set "s=Основной шлюз"
set "na1=openvpn"& set "na2=ethernet"
for %%A in ("%na1%" "%na2%") do (
set /a n+=1& set "shl!n!="
for /f "delims=[]" %%a in ('ipconfig /all^|find /n "%%~A"') do set "ns=%%a"
for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|more +!ns!^|find "%s%"') do if not defined shl!n! set "shl!n!=%%a"
)
echo %shl1: =% %shl2: =%
pause>nul
|
Время: 12:51.
© OSzone.net 2001-