Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Настройка "Подключения по локальной сети" с помощью CMD

Ответить
Настройки темы
CMD/BAT - [решено] Настройка "Подключения по локальной сети" с помощью CMD

Аватара для Oleg48

Старожил


Сообщения: 158
Благодарности: 17

Профиль | Отправить PM | Цитировать


Изменения
Автор: Oleg48
Дата: 15-10-2009
Подскажите пожалуйста можно ли с помощью cmd(bat)-файла настроить подключение по локальной сети, свойства "Протокола Интернета (TCP/IP)": IP-адрес, Маска подсети, Основной шлюз, Предпочитаемый DNS-сервер, Альтернативный DNS-сервер и т.д.

Отправлено: 10:24, 15-10-2009

 

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата boss911:
К сожалению, это метод работает по-разному. Если у меня между "Подключение" и "Подключение 2" выбирается первое, то на другом компе уже выбирается второе. »
boss911, вы, наверное, не совсем поняли как работает команда for. Возьмем ваш первоначальный пример:
Код: Выделить весь код
for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^"NetConnectionStatus^=2^" get NetConnectionID /value') do set NETWORK=%%a

echo %NETWORK%
Выражение в скобках - это команда, результат которой будет обработан и этот результат будет многострочным при наличии в системе нескольких интерфейсов. for будет обрабатывать каждую строку поочередно, т.е. при первой итерации переменной %a будет присвоена строка "Подключение по локальной сети", при второй (она же последняя) - "Подключение по локальной сети 2". Значение переменной %a присваивается переменной %NETWORK%, т.е. будет поочередно содержать в себе каждую строку вывода. В конце цикла значением %NETWORK% всегда будет последняя строка вывода. Поэтому либо нужно прерывать цикл на первой итерации, как намекнул Iska, либо ничего не присваивать переменной %NETWORK%, если она непуста, что я и сделал:
Код: Выделить весь код
set NETWORK=
for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^"NetConnectionStatus^=2^" get NetConnectionID /value') do if not defined NETWORK set NETWORK=%%a
echo %NETWORK%
if not defined NETWORK - если переменная %NETWORK% не определена (т.е у нас первая итерация), то присвоим ей значение. Это будет первая строка вывода. При последующих итерациях переменная %NETWORK% будет уже определена, поэтому присвоения set NETWORK=%%a уже не будет. Очистка переменной set NETWORK= нужна, чтобы при повторном выполнении команды for переменная %NETWORK% гарантированно не существовала, иначе на первой итерации ничего не присвоится. Очистку можно и после for делать, либо вообще обрамить for связкой setlocal\endlocal.

Цитата boss911:
Дело в том, что на каждом компьютере по-разному выводит порядок NetConnectionID »
Wmic выводит интерфейсы не по алфавитному порядку, а по уникальному свойству класса, имеющему, так называемый, квалификатор Key. Для класса Win32_networkadapter этим уникальным свойством является DeviceID (чем он меньше, тем "первей" интерфейс):
Код: Выделить весь код
wmic path Win32_networkadapter where "NetConnectionStatus=2" get NetConnectionID,DeviceID /value
Результат

DeviceID=7
NetConnectionID=Подключение по локальной сети


DeviceID=13
NetConnectionID=VirtualBox Host-Only Network

Последний раз редактировалось El Sanchez, 30-11-2011 в 14:54. Причина: DeviceID вместо Index, классы попутал

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:09, 26-11-2011 | #61



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для boss911

Alien


Сообщения: 4262
Благодарности: 1030

Профиль | Отправить PM | Цитировать


El Sanchez

То, что вы написали, я это примерно для себя понимал, посему и написал, что вся соль в том, что NetConnectionID выводит имена не по имени подключений, а, как я для себя выяснил из ваших слов, по уникальному индексу.

Iska предложил делать сортировку через SORT.EXE, но он не сортирует, как того хотелось бы, по логике, подключение "Подключение по локальной сети" без цифры в конце этого имени, всегда самым последним.

Хотел решить вопрос через sort.exe /+n но тут надо знать количество символов самого длинного имени, блин.

Последний раз редактировалось boss911, 26-11-2011 в 14:40.


Отправлено: 13:26, 26-11-2011 | #62


Аватара для boss911

Alien


Сообщения: 4262
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата boss911:
Хотел решить вопрос через sort.exe /+n но тут надо знать количество символов самого длинного имени, блин. »
Появилась идея (наверное, не реальная). При получении строк с NetConnectionID, определить самую длинную строку и потом в ней подсчитать количество символов, это количество (число) вывести в переменную %/+n%. Это реально сделать? Тогда вопрос с правильной сортировкой NetConnectionID будет решен.

Отправлено: 22:46, 26-11-2011 | #63


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


boss911, проблема не в «sort.exe», проблема в связке особенностей вывода «wmic.exe» и разбора «for /f».

Попробуйте использовать вывод в промежуточный временный файл, наподобие:
читать дальше »
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

call :GetTemporaryName

wmic.exe NIC get NetConnectionID /value >"%TemporaryName%"

for /f "tokens=2 delims==" %%i in (
	'type "%TemporaryName%" ^| sort.exe'
) do echo [%%i]

del /f /q "%TemporaryName%"

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
	setlocal enableextensions enabledelayedexpansion

:NextName
	set sTempName=%temp%\temp%random%.tmp

	if exist "%sTempName%" goto :NextName

	set sProcName=%~0

	endlocal & set %sProcName:~4%=%sTempName%
	exit /b 0
rem ==========================================================================

Результат
Код: Выделить весь код
[1394-соединение]
[Подключение по локальной сети]
[Подключение по локальной сети 2]
[Подключение по локальной сети 6]


В Вашем случае код может быть примерно таким:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

call :GetTemporaryName

wmic.exe NIC where "NetConnectionStatus=2" get NetConnectionID /value >"%TemporaryName%"

set sNetwork=

for /f "tokens=2 delims==" %%i in (
	'type "%TemporaryName%" ^| sort.exe'
) do if not defined sNetwork set sNetwork=%%i

echo [%sNetwork%]

del /f /q "%TemporaryName%"

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Функция GetTemporaryName()
rem
rem Серый форум / CMD/BAT: генерация пути для временного файла или папки
rem (http://forum.script-coding.com/viewtopic.php?id=6259)
rem ==========================================================================
:GetTemporaryName
	setlocal enableextensions enabledelayedexpansion

:NextName
	set sTempName=%temp%\temp%random%.tmp

	if exist "%sTempName%" goto :NextName

	set sProcName=%~0

	endlocal & set %sProcName:~4%=%sTempName%
	exit /b 0
rem ==========================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:57, 27-11-2011 | #64


Аватара для boss911

Alien


Сообщения: 4262
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Iska

Спасибо, теперь вроде работает как нужно. Сделал для себя немного компактнее код:
Код: Выделить весь код
@Echo off

SETLOCAL EnableExtensions EnableDelayedExpansion

SET NETWORK=
FOR /F "Delims=" %%i IN ('ECHO %TEMP%\~#%random%.tmp') DO SET TemporaryName="%%i"
WMIC PATH Win32_networkadapter WHERE "NetConnectionStatus=2" GET NetConnectionID /VALUE >%TemporaryName%
FOR /F "Tokens=2 Delims==" %%i IN ('TYPE %TemporaryName% ^| SORT') DO IF NOT Defined NETWORK SET NETWORK="%%i"

ECHO %NETWORK%

DEL /F /Q %TemporaryName%

ENDLOCAL
PAUSE >nul
Теперь другая проблема. Нужно игнорировать "1394" подключение. Это можно сделать через WMIC, чтобы оно его не выводило с другими 'NetConnectionID'? Или нужно фильтровать/отсекать по имени, желательно по шаблону *1394* (реально ли и как)?

Последний раз редактировалось boss911, 01-12-2011 в 09:24. Причина: добавил «@Echo off»


Отправлено: 11:46, 27-11-2011 | #65


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата boss911:
Нужно игнорировать "1394" подключение »
boss911, просто нужен правильный запрос:
Код: Выделить весь код
WMIC PATH Win32_NetworkAdapter WHERE "NetConnectionStatus=2 and AdapterTypeID=0" GET NetConnectionID /VALUE
P.S. Кстати, у sort.exe есть параметр /r

Отправлено: 19:19, 28-11-2011 | #66


Аватара для boss911

Alien


Сообщения: 4262
Благодарности: 1030

Профиль | Отправить PM | Цитировать


El Sanchez

Классы я уже видел, но вот как их правильно юзать, не вкуриваю. С вашим кодом все равно выводит 1394 подключение. Снова курю классы, но что-то не курится. Какое бы значение я не ставил, всегда "Отсутствуют экземпляры класса" (наверное, я чего-то не понимаю).

Ключ /r для sort.exe я пробовал, он пригоден только в одном случае, если же подключения названы немного по-другому, он будет только мешать. Не выход. Пока что правильно сортирует имена подключений код, который мне подсказал Iska.

Последний раз редактировалось boss911, 29-11-2011 в 00:29.


Отправлено: 00:17, 29-11-2011 | #67


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


boss911, может, ещё раз опишете, что Вы хотите получить? Я, например, вовсе запамятовал.

Отправлено: 02:21, 29-11-2011 | #68


Аватара для boss911

Alien


Сообщения: 4262
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Iska

Код: Выделить весь код
WMIC PATH Win32_networkadapter WHERE "NetConnectionStatus=2" GET NetConnectionID /VALUE
Результат
Код: Выделить весь код
NetConnectionID=Подключение по локальной сети
NetConnectionID=1394-подключение

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

Цитата boss911:
Это можно сделать через WMIC, чтобы оно его не выводило с другими 'NetConnectionID'? Или нужно фильтровать/отсекать по имени, желательно по шаблону *1394* (реально ли и как)? »
Ключ AdapterTypeID=0 для WMIC не помогает.

Отправлено: 02:42, 29-11-2011 | #69


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


boss911, я имел в виду — словами. Чем отличаются те соединения, которые нужно оставить, от тех, которые нужно убрать? Каковы критерии?

Отправлено: 04:57, 29-11-2011 | #70



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Настройка "Подключения по локальной сети" с помощью CMD

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
D-Link - D-LINK 300T "нет подключения по локальной сети"... yanvlad Сетевое оборудование 32 30-12-2009 08:48
Доступ - [решено] учетная запись "пользователь" нет поключения к локальной сети kanstantsin Microsoft Windows 2000/XP 5 30-11-2009 00:38
[решено] Доступ к локальной сети через входящее "Dial up" подключение Eugene R Microsoft Windows NT/2000/2003 6 10-03-2009 09:54
VBS/WSH/JS - [решено] Как добавить "сложное" значение в "бинарный" параметр реестра с помощью WSH 13Demon Скриптовые языки администрирования Windows 1 10-02-2009 09:47
[решено] Не видны подключения по локальной сети в папке "Сетевые подключения" Skoba Microsoft Windows NT/2000/2003 12 08-10-2007 09:06




 
Переход