mitiya |
29-06-2006 23:14 456274 |
как загнать имена всех "Подключение по локальной сети" в переменные ?
с помощью команды "netsh interface show interface" можно получить названия всех сетевых интерфейсов.
А мне бы хотелось создать в батнике переменные которые содержали б в себе эти названия, как бы их туда запихнуть ?
|
hasherfrog |
06-07-2006 10:19 458381 |
Можно чуть подробнее о том, как это в конечном счёте должно выглядеть?
Ну вот я выполняю такой батник, в его конце я вызываю set. И что там должно быть на выводе?
Код:
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\hasherfrog\Application Data
Basemake=C:\Program Files\Microsoft SDK\Include\BKOffice.Mak
Bkoffice=C:\Program Files\Microsoft SDK\.
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=***
ComSpec=C:\WINDOWS\system32\cmd.exe
...
Вот тут чего-то такое-эдакое. Что?
...
|
mitiya |
07-07-2006 01:49 458717 |
Че то я не совсем понял вопрос.
вообщем суть вот в чем:
после выполнения батника с таким вот кодом
Код:
netsh interface show interface
pause
получаем следущее на экране (в моем конкретном случае)
Код:
Состояние адм. Состояние Тип Имя интерфейса
---------------------------------------------------------------------
Разрешен Выделенный 1394-соединение
Разрешен Выделенный VMware Network Adapter VMnet1
Разрешен Выделенный Подключение по локальной сети
Разрешен Выделенный VMware Network Adapter VMnet8
Разрешен Внутренний Внутренний
Разрешен Замыкание на себя Замыкание на себя
дак вот мне надо как-то риализовать следующие
set lan1=1394-соединение
set lan2=VMware Network Adapter VMnet1
set lan3=Подключение по локальной сети
и т.д.
надеюсь прояснил ситуацию
|
hasherfrog |
07-07-2006 10:14 458792 |
mitiya
Ясно. А нужны именно ВСЕ? Или можно только "Выделенный", например?
И ещё. Вам обязательно bat? Может, vbs? А то громоздко очень получается...
|
hasherfrog |
07-07-2006 14:01 458908 |
Код:
@echo off
if exist "___1.tmp" del "___1.tmp"
for /f "TOKENS=3-9 DELIMS= " %%A in ('netsh interface show interface ^| find "Выделенный"') do echo %%A %%B %%C %%D %%E %%F %%G >> ___1.tmp
SET N=0
for /f "tokens=* eol=" %%A in (___1.tmp) do SET /A N+=1
set i=0
:again
if "%I%" == "%N%" goto end
if exist "___2.tmp" del "___2.tmp"
if "%I%" == "0" (
for /f "tokens=* eol=" %%A in (___1.tmp) do (
if not exist "___2.tmp" (
Set C=%%A
echo "" > ___2.tmp
)
)
) else (
for /f "skip=%I% tokens=* eol=" %%A in (___1.tmp) do (
if not exist "___2.tmp" (
Set C=%%A
echo "" > ___2.tmp
)
)
)
set /A I+=1
SET Lan%I%=%C%
goto again
:end
del ___1.tmp
del ___2.tmp
set | find "Lan"
Примечания.
1. Переменные окружения не экспортируются, не забыли? Действуют только внутри батника. Чтобы проэкспортировать их (вывести за пределы батника), используйте специальные утилиты.
2. Фиксируются только "Выделенные" интерфейсы. Проверка идёт по слову "Выделенный" после "^| find". Если вдруг не работает, убедитесь, что написано слово в _правильной_ кодировке.
|
mitiya |
09-07-2006 02:00 459348 |
Спасибо большёе.
Работает. Только не понятно как :-)
|
mitiya |
09-07-2006 02:30 459358 |
обнаружилась маленькая проблемка
значение в переменную записывается с пробелами в конце ,а надо без
т.е.
вот как получается
"Подключение по локальной сети "
а вот как должно
"Подключение по локальной сети"
у названий с разной длинной разное количество пробелов (такчто не удасться просто отрезать) :(
|
Vadikan |
09-07-2006 04:35 459375 |
Цитата:
Работает. Только не понятно как :-)
|
Для начала используется команда FOR, где TOKENS - элементы, получаемые разделителем, указанным в DELIMS. Элементы ищутся в результатах работы команды netsh interface show interface, после чего каждому элементу назначается буквенная переменная и заносится во временный файл. Далее работа ведется с этим файлом по схожему принципу.
|
hasherfrog |
09-07-2006 21:58 459565 |
>> обнаружилась маленькая проблемка
Решение загромоздит текст, но вот:
Код:
@echo off
if exist "___1.tmp" del "___1.tmp"
for /f "TOKENS=3-9 DELIMS= " %%A in ('netsh interface show interface ^| find "Выделенный"') do (
if "%%B" == "" ( echo %%A>> ___1.tmp
) else ( if "%%C" == "" ( echo %%A %%B>> ___1.tmp
) else ( if "%%D" == "" ( echo %%A %%B %%C>> ___1.tmp
) else ( if "%%E" == "" ( echo %%A %%B %%C %%D>> ___1.tmp
) else ( if "%%F" == "" ( echo %%A %%B %%C %%D %%E>> ___1.tmp
) else ( if "%%G" == "" ( echo %%A %%B %%C %%D %%E %%F>> ___1.tmp
) else ( echo %%A %%B %%C %%D %%E %%F %%G>> ___1.tmp
) ) ) ) ) ) )
SET N=0
for /f "tokens=* eol=" %%A in (___1.tmp) do SET /A N+=1
set i=0
:again
if "%I%" == "%N%" goto end
if exist "___2.tmp" del "___2.tmp"
if "%I%" == "0" (
for /f "tokens=* eol=" %%A in (___1.tmp) do (
if not exist "___2.tmp" (
Set C=%%A
echo "" > ___2.tmp
)
)
) else (
for /f "skip=%I% tokens=* eol=" %%A in (___1.tmp) do (
if not exist "___2.tmp" (
Set C=%%A
echo "" > ___2.tmp
)
)
)
set /A I+=1
SET Lan%I%=%C%
goto again
:end
if exist "___1.tmp" del "___1.tmp"
if exist "___2.tmp" del "___2.tmp"
set | find "Lan"
>> Только не понятно как :-)
"Интересность" тут одна: выставление флажка внутри for-цикла (). Решается двумя способами: заменой for на if-goto (когда возможно) либо использование флажка "есть файл" (когда невозможно). Есть ещё один вариант обхода - подпрограммы (в том чисте, подпрограммы прямо внутри данного батника), но я не стал это тут втыкать. :-) А в принципе, Vadikan описал что да как.
Почему "интересность" - потому что внутри for-цикла крайне проблематично использовать переменные окружения ;-)
|
mitiya |
09-07-2006 22:16 459571 |
Круто, работает. Ох спасибо ,спасибо.
|
Снова поднимаю эту тему. Сейчас я могу написать первый вариант без этих временных файлов , но вот как отрезаются пробелы в конце для меня до сих пор загадка. Может есть у кого какие идеи ?
|
Время: 18:05.
© OSzone.net 2001-