Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Операционные системы общие вопросы
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2011, 01:30   #1
Vilgelm
 
Регистрация: 05.06.2009
Сообщений: 7
По умолчанию Написать .bat: поиск данных в выводе команды и занесение в переменную

Здравствуйте.

Суть такова: требуется при каждом переподключении вручную прописывать несколько маршрутов. Дело тут не в том, что я не знаю опции "-p", а совсем в другом. Если кому-нибудь есть дело, могу рассказать. Короче суть заключается вот в чем: есть два шлюза - 192.168.1.1 - основной, и 10.35.24.1 - через него нужно прописать доступ на pandora.com Проблема в том, что вот этот 10.35.24.1 разный при каждом переподключении. У меня возникла такая вот идея: считываем вывод команды route print, ищем там строчку 128.0.0.0 128.0.0.0 10. , извлекаем все что начинается с 10., записываем в какую-то переменную, потом подставляем значение этой переменной в route add 208.85.40.50 %переменная%.

Что-то набросал, немного почитав мануалы, но оно, конечно же, не работает.

Код:
@echo off
echo route del 208.85.40.20 //удаляем старые маршруты
echo route del 208.85.40.50 //удаляем старые маршруты
echo route del 208.85.40.80 //удаляем старые маршруты
echo route change 0.0.0.0 mask 128.0.0.0 192.168.2.1 // это, для того, что бы трафик шел через основной шлюз
echo Create temp.txt //создаем файл (кстати не работает)
echo Create tmp.txt //создаем файл (кстати не работает)
echo route print>%~dp0\temp.txt // выводим результат команды route add в файл temp.txt
echo FIND      0.0.0.0        128.0.0.0       10. temp.txt>%~dp0\tmp.txt //выполняем поиск стоки в этом файле и выводим результат в tmp.txt
echo RESULT="FIND     10.* tmp.txt" //присваиваем значение команды переменной RESULT (тоже не работает)
echo route add 208.85.40.50 %RESULT% //прописываем маршруты, вместо шлюза подставляем значение переменной
echo route add 208.85.40.80 %RESULT% //прописываем маршруты, вместо шлюза подставляем значение переменной
echo route add 208.85.40.20 %RESULT%  //прописываем маршруты, вместо шлюза подставляем значение переменной
echo route delete 0.0.0.0 mask 128.0.0.0 %RESULT% // удаляем маршрут, который "заставляет" весь трафик ходить через дополнительный шлюз
В общем, как я и ожидал, это отказалось работать напрочь.

Помогите допилить, пожалуйста. Или хотя бы покажите подробную документацию по синтаксису .bat, ибо так и не смог такой найти.

Also сильно ногами не пинать, с .bat второй раз в жизни сталкиваюсь.

Заранее огромное спасибо!
Vilgelm вне форума Ответить с цитированием
Старый 13.08.2011, 04:58   #2
WildHunter
Ископаемый админ
Форумчанин
 
Аватар для WildHunter
 
Регистрация: 08.07.2010
Сообщений: 992
По умолчанию

Код:
echo route change 0.0.0.0 mask 128.0.0.0 192.168.2.1 // это, для того, что бы трафик шел через основной шлюз
Это нужно в самом конце, иначе получите два шлюза по умолчанию. И почему маска 128.0.0.0 а не 0.0.0.0?

Код:
echo Create temp.txt //создаем файл (кстати не работает)
echo Create tmp.txt //создаем файл (кстати не работает)
Это и не должно работать. В DOS нет такой команды.

Код:
route print -4>>temp.txt // выводим результат команды route add в файл temp.txt
Попробуйте так. Не надо слишком мудрить

Код:
echo FIND      0.0.0.0        128.0.0.0       10. temp.txt>%~dp0\tmp.txt //выполняем поиск стоки в этом файле и выводим результат в tmp.txt
echo RESULT="FIND     10.* tmp.txt" //присваиваем значение команды переменной RESULT (тоже не работает)
Вместо этого используйте FOR. Читайте внимательно описание команды по for /?
Особое внимание именованию переменных, оно там отличается от стандартного.

Код:
echo route delete 0.0.0.0 mask 128.0.0.0 %RESULT% // удаляем маршрут, который "заставляет" весь трафик ходить через дополнительный шлюз
После этого вставляем назначение нового шлюза по умолчанию.
Выписывайте лучший журнал о беспроводных технологиях "Ukrainian Wireless News"! Издается с 1913 года.

Последний раз редактировалось WildHunter; 13.08.2011 в 05:02.
WildHunter вне форума Ответить с цитированием
Старый 13.08.2011, 11:45   #3
Vilgelm
 
Регистрация: 05.06.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от WildHunter Посмотреть сообщение
И почему маска 128.0.0.0 а не 0.0.0.0?
Программа так прописывает, при этом 0.0.0.0 с маской 0.0.0.0 остается на основном шлюзе, но при этом весь трафик идет через VPN.

Цитата:
Сообщение от WildHunter Посмотреть сообщение
Это и не должно работать. В DOS нет такой команды.
Ок, файлы создаем вручную.

Цитата:
Сообщение от WildHunter Посмотреть сообщение
Попробуйте так. Не надо слишком мудрить
Хорошо А bat будет искать файл в каталоге с ним самим, или где-нибудь в C?



Огромное спасибо за ответ!
Vilgelm вне форума Ответить с цитированием
Старый 13.08.2011, 14:29   #4
WildHunter
Ископаемый админ
Форумчанин
 
Аватар для WildHunter
 
Регистрация: 08.07.2010
Сообщений: 992
По умолчанию

Цитата:
Сообщение от Vilgelm Посмотреть сообщение
Ок, файлы создаем вручную.
Файл создается автоматически при использовании той команды, что я привел. И в конце его нужно будет удалять, поскольку новый запуск батника будет не перезаписывать данные в нем, а дописывать в конец.

Цитата:
Хорошо А bat будет искать файл в каталоге с ним самим, или где-нибудь в C?
Можно в самом начале, после echo off, жестко задать рабочий каталог, тогда все действия будут происходить в нем. Например так:
C:
cd C:\work\
Выписывайте лучший журнал о беспроводных технологиях "Ukrainian Wireless News"! Издается с 1913 года.
WildHunter вне форума Ответить с цитированием
Старый 14.08.2011, 00:08   #5
Vilgelm
 
Регистрация: 05.06.2009
Сообщений: 7
По умолчанию

Спасибо.

Вот набросал с исправлениями:

Код:
route delete 208.85.40.20
route delete 208.85.40.50
route delete 208.85.40.80
route print 0.0.0.0 MASK 128* 10* -4>>temp.txt
FOR /F "tokens=2,3* delims= " %%i in (temp.txt) do @echo %%i %%j %%R
route add 208.85.40.50 %R
route add 208.85.40.80 %R
route add 208.85.40.20 %R 
route delete 0.0.0.0 mask 128.0.0.0 %R
route add 0.0.0.0 mask 128.0.0.0 192.168.2.1
route change 0.0.0.0 mask 128.0.0.0 192.168.2.1
Возникла проблема: что мне ставить в качестве параметра delims? Проблема в том, что вывод выглядит примерно так:
Код:
===========================================================================
Список интерфейсов
 59...00 00 00 00 00 00 ......Anchorfree HSS Adapter
 24...00 00 00 00 00 00 ......TAP-Win32 Adapter V9
 23...00 00 00 00 00 00 ......Microsoft Virtual WiFi Miniport Adapter
 12...00 00 00 00 00 00 ......Адаптер беспроводных сетей Atheros AR5007EG Wirele
ss
 11...00 00 00 00 00 00 ......Realtek RTL8139/810x Family Fast Ethernet сетевой
адаптер
  1...........................Software Loopback Interface 1
 25...00 00 00 00 00 00 00 e0 Адаптер Microsoft ISATAP
 22...00 00 00 00 00 00 00 e0 Адаптер Microsoft ISATAP #2
 15...00 00 00 00 00 00 00 e0 Адаптер Microsoft 6to4
 19...00 00 00 00 00 00 00 e0 Адаптер Microsoft 6to4 #3
 18...00 00 00 00 00 00 00 e0 Адаптер Microsoft 6to4 #2
 27...00 00 00 00 00 00 00 e0 Адаптер Microsoft ISATAP #3
 28...00 00 00 00 00 00 00 e0 Адаптер Microsoft ISATAP #4
 26...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
 51...00 00 00 00 00 00 00 e0 Адаптер Microsoft ISATAP #5
===========================================================================

IPv4 таблица маршрута
===========================================================================
Активные маршруты:
Сетевой адрес           Маска сети      Адрес шлюза       Интерфейс  Метрика
          0.0.0.0          0.0.0.0      192.168.2.1    192.168.2.100     25
          0.0.0.0        128.0.0.0      192.168.2.1    192.168.2.100     26
===========================================================================
Т.е. если я ставлю разделителем подстроки пробел, то получается, что в переменную попадает всяческий мусор. Если поставить несколько пробелов, то строки не разделятся, ибо количество пробелов между параметрами разное. Даже если я поставлю такое количество пробелов, которое идет перед адресом шлюза, то возникают две проблемы:
1. Попадает еще и интерфейс
2. Адрес шлюза может содержать разное количество цифр, соответственно и количество пробелов будет разное.

Ну и еще один момент: как мне при обработке пропустить Список интерфейсов? Пробовал задать параметр eol, но может быть только одно значение, а мне нужно примерно так eol=C,=,1,2,3,4,5,6,7,8,9 , но увы, такой вариант не предусмотрен.

Заранее огромное спасибо!

PS Подумал над вариантом запуска какой-нибудь сторонней программы-парсера, которая оставит в temp.txt только ip шлюза, но, к сожалению, понятия не имею, как такую программу реализовать (по идее должно быть просто )
UPD Может быть так:
Код:
for /f "tokens=* delims= " %%a in (temp.txt) do (set str=%%a
set str=!str:10*!
echo !str!
?

Последний раз редактировалось Vilgelm; 14.08.2011 в 00:14.
Vilgelm вне форума Ответить с цитированием
Старый 14.08.2011, 01:27   #6
WildHunter
Ископаемый админ
Форумчанин
 
Аватар для WildHunter
 
Регистрация: 08.07.2010
Сообщений: 992
По умолчанию

Попробуйте брать данные не из route, а например из
1. ipconfig
2. netsh int ip show route
3. Из реестра командой REG QUERY.
Нужные ключи реестра ищите здесь:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ntrolSet\services\Tcpip\Parameters\ Interfaces

Наверняка найдете вариант, который парсить будет несложно.
Выписывайте лучший журнал о беспроводных технологиях "Ukrainian Wireless News"! Издается с 1913 года.
WildHunter вне форума Ответить с цитированием
Старый 14.08.2011, 13:15   #7
Vilgelm
 
Регистрация: 05.06.2009
Сообщений: 7
По умолчанию

В общем спарсить я его смог. Вот так:
Код:
route print 0.0.0.0 MASK 128* -4>>temp.txt //выводим таблицу маршрутов в файл
FINDSTR /c:"10." temp.txt>tmp.txt //ищем строку с нужным шлюзом
FOR /F "tokens=2,3* delims= " %%i in (tmp.txt) do @echo %%i %%j % >tmp1.txt //убираем лишние данные
FOR /F "tokens=2,3* delims= " %%i in (tmp1.txt) do @echo %%i %%j //присваиваем ip шлюза переменной j
route add 208.85.40.50 %%j //выполняем добавление маршрута со значением переменной j
route add 208.85.40.80 %%j
route add 208.85.40.20 %%j
До добавления маршрута все работает прекрасно (если сделать вывод FOR /F "tokens=2,3* delims= " %%i in (tmp1.txt) do @echo %%i %%j в txt, увидим нужный IP).
Однако дальше начинается какая-то ересь. Т.е. выполняется просто route add 208.85.40.50, без IP шлюза, что приводит к выводу справки. Короче, данные из переменной не подставляются. Думал, что вызываю ее неправильно, пробовал вызывать как %j - тогда пишет "Ошибка параметра" (выполняется команда route add 208.85.40.50 j). Пробовал как %j%, результат как и в первом случае.

Как нужно вызвать переменную?
Vilgelm вне форума Ответить с цитированием
Старый 14.08.2011, 16:45   #8
WildHunter
Ископаемый админ
Форумчанин
 
Аватар для WildHunter
 
Регистрация: 08.07.2010
Сообщений: 992
По умолчанию

route add 208.85.40.20 %j%
Все сработало.
Смотрите внимательно, возможно где-то лишние пробелы в переменной.
Выписывайте лучший журнал о беспроводных технологиях "Ukrainian Wireless News"! Издается с 1913 года.
WildHunter вне форума Ответить с цитированием
Старый 14.08.2011, 16:46   #9
Vilgelm
 
Регистрация: 05.06.2009
Сообщений: 7
По умолчанию

Все, сделал:

Код:
route delete 208.85.40.20 //удаляем предыдущие маршруты до pandora.com
 route delete 208.85.40.50
 route delete 208.85.40.80
 for /f "tokens=3" %%i in ('route print 0.0.0.0 MASK 128* -4 ^| findstr "10\."') do (

 route add 208.85.40.80 %%i
 route add 208.85.40.20 %%i
 route add 208.85.40.50 %%i
 route delete 0.0.0.0 mask 128.0.0.0 %%i
 route delete 128.0.0.0 mask 128.0.0.0 %%i
 route delete 0.0.0.0 mask 0.0.0.0 %%i

 ) //производим поиск IP шлюза VPN, заносим его в переменную, прописываем маршруты до pandora.com, 
удаляем маршруты по умолчанию для VPN. Почему три? Не знаю, спросите у разработчиков программы.
 route add 0.0.0.0 mask 128.0.0.0 192.168.2.1 //добавляем шлюз по умолчанию, на случай, если мы его случайно удалили
 route change 0.0.0.0 mask 128.0.0.0 192.168.2.1 //восстанавливаем значение шлюза по умолчанию (это на случай, если он уже существовал).
Спасибо за помощь!
Vilgelm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Надо написать 2 BAT файла TypeString Фриланс 4 09.08.2010 09:50
.bat файлы; передача значения из файла в переменную Manik Помощь студентам 1 06.05.2010 10:36
Почему цикл for /r %disk% %%b в bat скрипте не принимает переменную DS75 Помощь студентам 0 31.03.2010 13:14
ошибка в выводе данных поиска bloger PHP 1 10.03.2010 17:07
Отследить команды, и написать бота. bassoto PHP 10 14.05.2009 17:34