Войти

Показать полную графическую версию : как загнать имена всех "Подключение по локальной сети" в переменные ?


mitiya
29-06-2006, 23:14
с помощью команды "netsh interface show interface" можно получить названия всех сетевых интерфейсов.

А мне бы хотелось создать в батнике переменные которые содержали б в себе эти названия, как бы их туда запихнуть ?

hasherfrog
06-07-2006, 10:19
Можно чуть подробнее о том, как это в конечном счёте должно выглядеть?
Ну вот я выполняю такой батник, в его конце я вызываю 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
Че то я не совсем понял вопрос.

вообщем суть вот в чем:

после выполнения батника с таким вот кодом




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
mitiya
Ясно. А нужны именно ВСЕ? Или можно только "Выделенный", например?


И ещё. Вам обязательно bat? Может, vbs? А то громоздко очень получается...

hasherfrog
07-07-2006, 14:01
@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
Спасибо большёе.

Работает. Только не понятно как :-)

mitiya
09-07-2006, 02:30
обнаружилась маленькая проблемка

значение в переменную записывается с пробелами в конце ,а надо без

т.е.

вот как получается

"Подключение по локальной сети "

а вот как должно

"Подключение по локальной сети"

у названий с разной длинной разное количество пробелов (такчто не удасться просто отрезать) :(

Vadikan
09-07-2006, 04:35
Работает. Только не понятно как :-)
Для начала используется команда FOR, где TOKENS - элементы, получаемые разделителем, указанным в DELIMS. Элементы ищутся в результатах работы команды netsh interface show interface, после чего каждому элементу назначается буквенная переменная и заносится во временный файл. Далее работа ведется с этим файлом по схожему принципу.

hasherfrog
09-07-2006, 21:58
>> обнаружилась маленькая проблемка
Решение загромоздит текст, но вот:

@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
Круто, работает. Ох спасибо ,спасибо.

mitiya
30-06-2010, 22:12
Снова поднимаю эту тему. Сейчас я могу написать первый вариант без этих временных файлов , но вот как отрезаются пробелы в конце для меня до сих пор загадка. Может есть у кого какие идеи ?




© OSzone.net 2001-2012