PDA

Показать полную графическую версию : [решено] Настройка "Подключения по локальной сети" с помощью CMD


Страниц : 1 2 3 [4] 5

El Sanchez
26-11-2011, 13:09
К сожалению, это метод работает по-разному. Если у меня между "Подключение" и "Подключение 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.

Дело в том, что на каждом компьютере по-разному выводит порядок 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

boss911
26-11-2011, 13:26
El Sanchez

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

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

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

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

Iska
27-11-2011, 04:57
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 ==========================================================================

boss911
27-11-2011, 11:46
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* (реально ли и как)?

El Sanchez
28-11-2011, 19:19
Нужно игнорировать "1394" подключение »
boss911, просто нужен правильный запрос:

WMIC PATH Win32_NetworkAdapter (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394216(v=vs.85).aspx) WHERE "NetConnectionStatus=2 and AdapterTypeID=0" GET NetConnectionID /VALUE

P.S. Кстати, у sort.exe есть параметр /r

boss911
29-11-2011, 00:17
El Sanchez

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

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

Iska
29-11-2011, 02:21
boss911, может, ещё раз опишете, что Вы хотите получить? Я, например, вовсе запамятовал.

boss911
29-11-2011, 02:42
Iska

WMIC PATH Win32_networkadapter WHERE "NetConnectionStatus=2" GET NetConnectionID /VALUE
NetConnectionID=Подключение по локальной сети
NetConnectionID=1394-подключение
Мне нужно, чтобы 1394 я не видел в этом списке, точнее сказать, применив этот код (http://forum.oszone.net/post-1804130-65.html), оно игнорировало это подключение.

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

Iska
29-11-2011, 04:57
boss911, я имел в виду — словами. Чем отличаются те соединения, которые нужно оставить, от тех, которые нужно убрать? Каковы критерии?

El Sanchez
29-11-2011, 16:46
Ключ AdapterTypeID=0 для WMIC не помогает »
MSDN говорит, что для 1394-устройств AdapterTypeID=13, но раз ноль возвращает, черт с ним.
Фильтрацию по имени проводить - последнее дело, но раз так нужно, то:

WMIC PATH Win32_NetworkAdapter WHERE "NetConnectionStatus=2 AND NOT NetConnectionID LIKE '%1394%'" GET NetConnectionID /VALUE

Iska
29-11-2011, 21:41
El Sanchez, к сожалению, что у меня, что, надо полагать, у коллеги boss911, данное сетевое соединение, будучи подключённым, имеет тип сети («Ethernet 802.3»). Скорее всего, что драйвер говорит провайдеру Wbem, то и получаем.

boss911, увы :(.

boss911
30-11-2011, 00:03
MSDN говорит, что для 1394-устройств AdapterTypeID=13 »
Я пробовал, получаю "Отсутствуют экземпляры класса".

Фильтрацию по имени проводить - последнее дело »
Раз другой возможности нет, то выбирать не с чего. Спасибо, работает. Можно сюда добавить еще одну фильтрацию, чтобы фильтровала два и более подключений, например '%VirtualBox%'? Я пробовал и так и сяк, не хочет.

El Sanchez
30-11-2011, 14:59
Раз другой возможности нет, то выбирать не с чего. Спасибо, работает. Можно сюда добавить еще одну фильтрацию, чтобы фильтровала два и более подключений, например '%VirtualBox%'? »
boss911,

WMIC PATH Win32_NetworkAdapter WHERE "NetConnectionStatus=2 AND NOT NetConnectionID LIKE '%1394%' AND NOT NetConnectionID LIKE '%VirtualBox%'" GET NetConnectionID /VALUE

Можно еще попробовать фильтровать по свойству PNPDeviceID, у обычных сетевух значение начинается с PCI\VEN:

WMIC PATH Win32_NetworkAdapter WHERE "NetConnectionStatus=2 AND PNPDeviceID LIKE 'PCI\\VEN%'" GET NetConnectionID /VALUE

Iska
30-11-2011, 19:53
El Sanchez, логично. А, может быть, даже наоборот, отсекать, содержащие:
NetConnectionID PNPDeviceID
1394-соединение V1394\NIC1394\A4B3DB11D800

boss911
01-12-2011, 07:11
Кажись начинают нервы сдавать. Беру этот код (http://forum.oszone.net/post-1804130-65.html) (точно рабочий) и меняю в нем строку на эту (пару постов выше):
WMIC PATH Win32_NetworkAdapter WHERE "NetConnectionStatus=2 AND PNPDeviceID LIKE 'PCI\\VEN%'" GET NetConnectionID /VALUE >%TemporaryName%
и получею фигу:
Узел - HOME
ОШИБКА:
Код = 0x80041017
Описание = Недопустимый запрос
Услуга = WMI

Не удается найти указанный файл.
Режим вывода команд на экран (ECHO) отключен.
Не удается найти C:\DOCUME~1\boss911\LOCALS~1\Temp\~#30207.tmp
Отдельно строка отлично работает, а с кодом не хочет. Так же нормально работает код, но с этой строкой не хочет. Как понимать это издевательство?

Iska
01-12-2011, 08:05
boss911, в том скрипте (http://forum.oszone.net/post-1804130-65.html) у Вас не указано «@echo off», и, тем не менее, Вы не видите ошибки?! Удваивайте в пакетных файлах символ «%» там, где потребно:
WMIC PATH Win32_NetworkAdapter WHERE "NetConnectionStatus=2 AND PNPDeviceID LIKE 'PCI\\VEN%%'" GET NetConnectionID /VALUE >%TemporaryName%

boss911
01-12-2011, 09:23
не указано «@echo off» »
Я его просто не указал в своем посте (подразумевая, что его и так все ставят, я так точно), а в тестируемом батнике оно, конечно же, присутствует.

К сожалению, я не разбираюсь, в каких случаях, где потребно, удваивать знак «%», хоть и знал о таком нюансе. Спасибо.

El Sanchez
01-12-2011, 14:51
не разбираюсь, в каких случаях, где потребно, удваивать знак «%» »
boss911, для просветления кармы (http://support.microsoft.com/kb/75634/en-us):)

boss911
02-12-2011, 09:56
@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 AND PNPDeviceID LIKE 'PCI\\VEN%%'" GET NetConnectionID /VALUE 2>nul >%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% 2>nul

ENDLOCAL
PAUSE >nul
Пытался сделать так, чтобы оно мне выводило сообщение:
Сетевое подключение не найдено или оно не подключено.
Но у меня ничего не вышло. Если я отключаю свое подключение, оно говорит "Отсутствуют экземпляры класса.", вот от этой ошибки я и хотел плясать, типа через ELSE, но и тут не получилось. Интересно, WMIC умеет говорить, что подключений не найдено или оно отключено, чтобы на основании этого выводить свое сообщение?

В общем, нужно сделать, чтобы при не нахождении подключения или его отключенности, а может и при какой-то другой ошибки (не столь важно), оно мне говорило то, что я написал выше.




© OSzone.net 2001-2012