Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Сетевые технологии (http://forum.oszone.net/forumdisplay.php?f=31)
-   -   как загнать имена всех "Подключение по локальной сети" в переменные ? (http://forum.oszone.net/showthread.php?t=67920)

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

Круто, работает. Ох спасибо ,спасибо.

mitiya 30-06-2010 22:12 1444848

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


Время: 18:05.

Время: 18:05.
© OSzone.net 2001-