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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Настройка "Подключения по локальной сети" с помощью CMD (http://forum.oszone.net/showthread.php?t=153257)

Oleg48 15-10-2009 10:24 1243495

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

amel27 15-10-2009 10:36 1243510

Цитата:

Цитата Oleg48
IP-адрес, Маска подсети, Основной шлюз »

Код:

netsh int ip set address /?
Цитата:

Цитата Oleg48
Предпочитаемый DNS-сервер, Альтернативный DNS-сервер »

Код:

netsh int ip set dns /?
P.S. для XP/2003

doomspace 15-10-2009 13:16 1243651

1.Настройте сеть (т.е. выставьте ip, subnet, gateway, dns, wins…)
2.Запустите command prompt - нажмите Win+R и введите cmd
3.Введите:
netsh -c interface dump > c:/homesettings.txt

Примечание: путь к файлу и его имя можете выбрать по своему желанию

4.Теперь настройте другую сеть - повторите шаги с 1 по 3
5.На desktop’е создайте ссылку (клик правой кнопкой мыши - New - Shortcut), которая будет указывать на
%windir%\system32\netsh.exe -f c:\homesettings.txt

Примечание: путь к файлу и его имя надо указать то же, что и в пункте 3

Для других компов меняем содержимое файлика homesettings.txt

Oleg48 15-10-2009 16:36 1243803

amel27 немного не разобрался, но ответ уже есть.
Большое спасибо doomspace за быстрый и очень полезный ответ, cmd я сам сваяю :)

Oleg48 15-10-2009 17:50 1243863

Итог, по заданному мной вопросу (составленный по ответу doomspace) :
Для снятие данных сетевых настроек, запускаем файл (cmd)
Код:

@echo off 
netsh -c interface dump > netsettings.txt 
exit

Данные помещаются в рядом лежащий файл netsettings.txt
Корректируем файл netsettings.txt оставив в нем нужные настройки.
Примерно так
Код:

# ----------------------------------------- 
# Настройка IP-интерфейсов                   
# ----------------------------------------- 
pushd interface ip   
# Интерфейс настройки IP для "Подключение по локальной сети"   
set address name="Подключение по локальной сети" source=static addr=192.168.1.10 mask=255.255.255.0 
set address name="Подключение по локальной сети" gateway=192.168.1.1 gwmetric=0 
set dns name="Подключение по локальной сети" source=static addr=82.209.213.60 register=PRIMARY 
add dns name="Подключение по локальной сети" addr=193.232.248.2 index=2 
set wins name="Подключение по локальной сети" source=static addr=none     
popd 
# Конец настройки интерфейса IP

Полученный netsettings.txt размещаем рядом с файлом (cmd)
Код:

@echo off 
start /wait netsh.exe -f netsettings.txt 
exit

на другом компьютере настройки которого нужно изменить и запускаем его.
Настройки изменены, спасибо doomspace.

Oleg48 16-10-2009 23:45 1245015

Еще одно решение, более гибкое и интерестное:
CMD-файл
Код:

@echo off 
netsh interface ip set address name="Подключение по локальной сети" static 192.168.1.2 255.255.255.0 192.168.1.1 0 
netsh interface ip set dns name="Подключение по локальной сети" static 82.209.213.60 primary 
netsh interface ip add dns name="Подключение по локальной сети" 193.232.248.2 2 
exit

Главное файл должен быть написан в кодировке DOS

Arhimed64 10-11-2009 00:09 1266217

А в Висте все это будет работать?

SAPINGT 04-01-2010 16:50 1310612

Всех все устраивает в этих батниках?
Но они же не универсальны!!!
И вся попа кроется в том что (лично я не знаю) как узнать название "Подключение по локальной сети".
Ведь все мы не раз сталкивались с тем что у кого то это не "Подключение по локальной сети", а "Подключение по локальной сети 5" или еще хлеще "inet" ... и тому подобное
Какая же это автоматизация ... если все равно лезешь и правишь ручками! :help:
Если кто в курсе - подскажите.

Petya V4sechkin 04-01-2010 16:57 1310618

Цитата:

Цитата SAPINGT
как узнать название

[решено] Автомат. изменение IP адреса

El Sanchez 04-01-2010 17:56 1310658

Цитата:

Цитата SAPINGT
как узнать название "Подключение по локальной сети" »

Код:

for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^"NetConnectionStatus^=2^" get NetConnectionID /value') do echo %%a

SAPINGT 08-01-2010 18:56 1314389

Цитата:

Цитата El Sanchez
Цитировать »

класс ...!!!

SAPINGT 11-01-2010 19:55 1317515

Сколько в гугле не смотрел но найти не могу ответ на свой вопрос:
Хранит ли реестр текущее состояние сетевого адаптера? Именно интересует есть ли такой параметр где бы отображалось при включенном кабеле (Link UP) одно значение и другое при Link Down (сетевой кабель не подключен) - другое ...
Или какие могут быть варианты ... надо просто определять для отдельно каждого адаптера значение в Up или Down подключение ...

ipconfig не предлагать ... нужно четкое получение состояния ... пробую писать прогу ))) :teeth:

и getmac тоже не хочется ...

SAOPP 12-01-2010 15:22 1318206

Пару лет назад, появлялась необходимость в написании таких батников, хоть уже и всё сказано, всё же приведу свои примерчики, может быть будут полезны:
Код:

netsh interface ipv4 set address "Подключение по локальной сети" static 10.9.46.107 255.255.254.0 10.9.46.1 0
netsh interface ipv4 set dnsserver "Подключение по локальной сети" static 192.168.3.1
netsh interface ipv4 add dnsserver "Подключение по локальной сети" 10.9.20.242 index=2

Где "Подключение по локальной сети" - "название вашего соединения".

Код:

netsh interface ipv4 set address "Подключение по локальной сети" static 10.9.46.107 255.255.254.0 10.9.46.1 0
netsh interface ipv4 add address "Подключение по локальной сети" 192.168.1.3  255.255.255.0
netsh interface ipv4 set dnsserver "Подключение по локальной сети" static 192.168.3.1
netsh interface ipv4 add dnsserver "Подключение по локальной сети" 10.9.20.242 index=2

Как видно выше, присутствует дополнительный адрес подсети и его dns. Другими словами, второй ip и dns для одной карты...

И т.д., /? в помощь.

AHTuKuJIJIeP 05-03-2010 23:43 1362112

Цитата:

Цитата El Sanchez
Цитата SAPINGT:
как узнать название "Подключение по локальной сети" »
Код:
for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^"NetConnectionStatus^=2^" get NetConnectionID /value') do echo %%a »

пробую этот код, и не работает. Работает ли он на Windows 7 ?

Jockerx 11-05-2010 20:36 1411172

У меня на Windows 7 работает, просто окно быстро закрывается, в конце кода можно добавить pause для прочтения. Выдает название подключения по локальной сети, к которому подключен кабель. А можно сделать код который после определения активного сетевого подключения переименовывал его в конкретное имя, например "Inet"?

voler 26-07-2010 16:24 1460937

Вот как сделалать пришлось мне для одного ПК.
Кодировка DOS
Код:

@echo off
echo ‘¬Ґ** *¤аҐб*, ¬*бЄЁ Ё и«о§
@echo off
netsh interface ip set address name="Џ®¤Є«озҐ*ЁҐ Ї® «®Є*«м*®© бҐвЁ" source=static 192.168.1.222 255.255.255.0 192.168.1.200 1
echo Џа®ЇЁиҐ¬ „Ќ‘ бҐаўҐа
@echo off
netsh int ip set dns name="Џ®¤Є«озҐ*ЁҐ Ї® «®Є*«м*®© бҐвЁ" source=static addr=192.168.1.101
@echo off
netsh int ip add dns name="Џ®¤Є«озҐ*ЁҐ Ї® «®Є*«м*®© бҐвЁ" 192.168.1.200
@echo off
netsh int ip show address >> .\change_network.log
@echo off
netsh int ip show dns >> .\change_network.log


Nun-Nun 14-09-2010 11:43 1495018

А как с помощью батника не только определить текущее название сетевого подключения и ввести его настройки, но и переименовать его из "Подключение по локальной сети", например, в "Интернет" ?

Petya V4sechkin 14-09-2010 12:14 1495039

Nun-Nun, на основе этого скрипта делаем RenameNetworkConnection.vbs
Код:

If WScript.Arguments.Count <> 2 Then
  WScript.Echo "Неверное число параметров." & vbCrLf & _
              "Использование: CScript.exe " & WScript.ScriptName & _
              " <Старое имя интерфейса> <Новое имя>"
  WScript.Quit(1)
End If

Const NETWORK_CONNECTIONS = &H31&

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(NETWORK_CONNECTIONS)

Set colItems = objFolder.Items
For Each objItem in colItems
  If objItem.Name = WScript.Arguments(0) Then
    objItem.Name = WScript.Arguments(1)
  End If
Next

и запускаем его из батника.

Nun-Nun 14-09-2010 13:55 1495103

Попробовал. Ввёл в текст скрипта свои названия, скопировал скрипт в текстовый файл, сохранил как RenameNetworkConnection.vbs. Запустил этот файл из батника, и что-то не пошло - никакого переименования не происходит, а на экран выводится сообщение (см. скриншот):

Petya V4sechkin 14-09-2010 14:17 1495117

Цитата:

Цитата Nun-Nun
Ввёл в текст скрипта свои названия

Не надо в текст вводить свои названия.

Цитата:

Цитата Nun-Nun
на экран выводится сообщение

Сохраните скрипт в стандартной кодировке win-1251, тогда увидите:

Цитата:

Неверное число параметров.
Использование: CScript.exe RenameNetworkConnection.vbs <Старое имя интерфейса> <Новое имя>
Это должно быть понятно.

Nun-Nun 14-09-2010 14:34 1495125

Понял, исправил - всё работает!

Nun-Nun 14-09-2010 16:42 1495225

Есть ещё один вопрос. Используя скрипты, приведённые в данной теме, попробовал объединить решение нескольких задач в одном батнике: определение названия сетевого соединения, смена названия сетевого соединения на своё и ввод параметров сетевого соединения. В итоге первые две задачи выполняются нормально, а вот с третьей что-то никак. Может кто подскажет, как это должно выглядеть, чтобы было правильно? Как задать значение (найденное название соединения), которое бы подставлялась в качестве первого параметра для RenameNetworkConnection.vbs ?
Код:

@echo off
for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^"NetConnectionStatus^=2^" get NetConnectionID /value') do echo %%a
RenameNetworkConnection.vbs "Старое название" "Интернет"
netsh interface ip set address name="Старое название" static 192.168.1.2 255.255.255.0 192.168.1.1 0 
netsh interface ip set dns name="Старое название" static 82.209.213.60 primary 
netsh interface ip add dns name="Старое название" 193.232.248.2 2 
pause
exit

В итоге получаю это (см. скриншот):

Petya V4sechkin 14-09-2010 17:55 1495283

Nun-Nun, а если подключений несколько, какое выбирать?

Nun-Nun 14-09-2010 20:08 1495361

Petya V4sechkin,

Правильно, как с этим быть я тоже не знаю. :cry: Да и не только это. Вон на скриншоте написано "Отсутствуют экземляры класса". Что за экземпляры, какого класса... - ... его знает?.. Я в этом деле ещё чайник. Мне бы для начала с одним (первым) подключением разобраться. Первым обычно идёт подключение для сетевой карты, потом вайфаи, синезубы и т.п. (я так думаю).

Nun-Nun 15-09-2010 14:17 1495896

Ну так что, по поводу подстановки переменной никто подсказать не может?

amel27 16-09-2010 07:48 1496427

как вариант:
Код:

@Echo Off

For /F "Skip=1 Tokens=1" %%i In ('WMIC NICConfig WHERE IPEnabled^=TRUE Get MACAddress^,SettingID') Do Set MAC=%%i
For /F "Delims="  %%i In ('WMIC NIC WHERE MACAddress^="%MAC%" Get NetConnectionID /Value^|Find "="') Do Set "%%i"
If "%NetConnectionID:~-1%"=="" Set NetConnectionID=%NetConnectionID:~,-1%

Echo %NetConnectionID%
Pause >Nul


Nun-Nun 16-09-2010 21:22 1497135

amel27,

Запускаю Ваш скрипт на Win7 x64 ... Вроде что-то делает, но не успеваю прочесть сообщение в консольном окне - пауза игнорируется и окно закрывается. На XP x32 мелькает название текущего соединения.
Не совсем ясно, что именно скрипт делает - определяет настройки текущего соединения или его название?

asdasd 28-09-2010 10:14 1506282

Вложений: 1
Подскажите пожалуйста. Как через cmd добавлять второстепенные шлюзы. В справке netsh я такого не нашел.
Вот скрин

Petya V4sechkin 28-09-2010 10:40 1506306

Цитата:

Цитата asdasd
Как через cmd добавлять второстепенные шлюзы.

Код:

netsh int ip add address name="имя интерфейса" gateway=шлюз gwmetric=0

asdasd 28-09-2010 10:57 1506322

Работает. Спасибо.

DonQuixote 29-12-2010 08:09 1576769

у меня проблемы на вин7
при использовании netsh -c interface dump > netsettings.txt копируются не все параметры к примеру нету ни dns а при попытки установки настройки меняються на статичные но поля где доложны быть все ip пустые
Код:

# ----------------------------------
# Конфигурация IPv4
# ----------------------------------
pushd interface ipv4

reset
set global icmpredirects=enabled
add route prefix=0.0.0.0/0 interface="Подключение по локальной сети" nexthop=192.168.1.1 publish=Да
add address name="Подключение по локальной сети" address=192.168.1.2 mask=255.255.255.0


popd
# Конец конфигурации  IPv4

на XP же выглядит все как надо
Код:

# -----------------------------------------
# Настройка IP-интерфейсов                 
# -----------------------------------------
pushd interface ip


# Интерфейс настройки IP для "Подключение по локальной сети"

set address name="Подключение по локальной сети" source=static addr=192.168.1.2 mask=255.255.255.0
set address name="Подключение по локальной сети" gateway=192.168.1.1 gwmetric=
set dns name="Подключение по локальной сети" source=static addr=77.40.0.2 register=PRIMARY
add dns name="Подключение по локальной сети" addr=77.40.0.3 index=2
set wins name="Подключение по локальной сети" source=static addr=none


popd
# Конец настройки интерфейса IP

что делать подскажите....и ещё не много не по теме при на строки подключения почему то даже если введёшь ip и сохранишь они бывают сами пропадают...тот же шлюз или днс ....приходиться пару раз так делать при этом отключаясь и подключаясь к сети
сижу через маршрутизатор.

wookoos 20-10-2011 20:45 1778044

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

Petya V4sechkin 20-10-2011 21:10 1778067

Цитата:

Цитата wookoos
как включить из батника сеть и выключить

С помощью DevCon (пример) или CNic.exe (пример там же).

Цитата:

предварительно проверив состояние
При каком состоянии какое действие хотите выполнить?

boss911 23-11-2011 00:43 1801232

Увы, но у меня ничего неполучается, чтобы узнать имя подключения, мне нужно только посредством CMD. Есть у меня код, но он работает только на XP, а дело в том, что вывод IPCONFIG в XP и в Win7 разный.

WinXP
Код:

Настройка протокола IP для Windows


Подключение по локальной сети - Ethernet адаптер:

      DNS-суффикс этого подключения . . :
      IP-адрес  . . . . . . . . . . . . : xxx.xxx.xxx.xxx
      Маска подсети . . . . . . . . . . : xxx.xxx.xxx.xxx
      Основной шлюз . . . . . . . . . . : xxx.xxx.xxx.xxx

Win7
Код:

Настройка протокола IP для Windows


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

  DNS-суффикс подключения . . . . . :
  Локальный IPv6-адрес канала . . . : xxxx::xxxx:xxx:xxxx:xxxx%xx
  IPv4-адрес. . . . . . . . . . . . : xxx.xxx.xxx.xxx
  Маска подсети . . . . . . . . . . : xxx.xxx.xxx.xxx
  Основной шлюз. . . . . . . . . : xxx.xxx.xxx.xxx

Туннельный адаптер isatap.{9D37GYF8-A5E7-98F2-824E-189V70K9773L}:

  Состояние среды. . . . . . . . : Среда передачи недоступна.
  DNS-суффикс подключения . . . . . :

Туннельный адаптер Подключение по локальной сети* 2:

  DNS-суффикс подключения . . . . . :
  IPv6-адрес. . . . . . . . . . . . : xxxx:x:xxxx:xxxx:xxxx:xxx:xxxx:xxxx
  Локальный IPv6-адрес канала . . . : xxxx::xxxx:xxx:xxxx:xxx%xx
  Основной шлюз. . . . . . . . . : :


Соответственно на Win7 я получаю неверное имя. Данный код на XP работать не хочет:
Код:

Неизвестное исключительное состояние WMIC.
Не уже ли нет универсального кода в CMD для WinXP и Win7 ? Конечно, можно батником определить какая ОС и в зависимости от ОС выполнить тот (мой) или этот код, но явно не кошерно это будет, хочется один универсальный код.

Iska 23-11-2011 02:01 1801272

boss911, у меня:
Цитата:

Цитата boss911
Данный код на XP работать не хочет: »

на XP работает. Скорее всего, дело не в коде.

Цитата:

Цитата boss911
Не уже ли нет универсального кода в CMD для WinXP и Win7 ? »

Он и так универсален. Но Вы же задействуете утилиты разных версий для XP и Windows 7 — так что, сам язык пакетных файлов тут не при чём. Переходите на WSH или на PoSH, там зависимость от версии ОС ниже.

boss911 23-11-2011 02:43 1801298

Цитата:

Цитата Iska
на XP работает. »

Проверил еще на одной ХР SP3 (у друга), все то же, что и у меня:
Код:

Неизвестное исключительное состояние WMIC.
Все дело в команде (классы не отрабатывает):
Код:

wmic path Win32_networkadapter
она выдает такой результат.

Применение других скриптов, в отличие от CMD, мне не подходит.

Iska 23-11-2011 04:00 1801325

boss911, попробуйте восстановление WBEM.

boss911 23-11-2011 05:08 1801331

Iska

Все сделал по инструкции (все прошло без сбоев), эффект все тот же. Да и чему ему ломаться, ОС недели три назад переустанавливал (оригинал XP SP3 VL + октябрьский UpdatePack).

Foreigner 23-11-2011 07:16 1801352

boss911,
Попробуй так:
Код:

set "wmic=wmic path Win32_networkadapter where NetConnectionStatus="2" get NetConnectionID /value"
for /f "tokens=2 delims==" %%a in (' "%wmic%" ') do echo %%a


boss911 23-11-2011 08:54 1801375

Foreigner

Спасибо, но, увы. Я выше говорил, что проблема в том, что команда wmic path Win32_networkadapter у меня выдает такой результат:
Код:

Неизвестное исключительное состояние WMIC.
Я в инете, для эксперимента, нашел еще пару классов, чтобы посмотреть, что будет, но и с теми классами получаю вышеуказанный результат. Проблема не с кодом, как я понял, а с WMIC на WinXP (не только на моей машине).

Petya V4sechkin 23-11-2011 09:04 1801383

Цитата:

Цитата boss911
Проблема не с кодом, как я понял, а с WMIC на WinXP

Цитата:

Цитата boss911
оригинал XP SP3 VL + октябрьский UpdatePack

С какими аддонами? ExtremePack?
Смотрите версии файлов в папке \WINDOWS\system32\wbem
Cimwin32.dll и т. д.

boss911 23-11-2011 10:04 1801415

Цитата:

Цитата Petya V4sechkin
С какими аддонами? »

Дефолтные + DirectX32, MRT_Mod-11.10.11, TcpIP-500 и Z_DRV_INST. ExtremePack никогда не юзал.

Версии файлов в папке \WINDOWS\system32\wbem
Код:

xml\wmi2xml.dll        5.1.2600.0
cimwin32.dll        5.105.1.2600.5512
CmdEvTgProv.dll        5.105.1.2600.5512
dsprov.dll        5.105.1.2600.0
esscli.dll        5.105.1.2600.5512
evntrprv.dll        5.105.1.2600.5512
fastprox.dll        5.105.1.2600.5755
framedyn.dll        5.105.1.2600.5512
fwdprov.dll        5.105.1.2600.0
krnlprov.dll        5.105.1.2600.5512
mofcomp.exe        5.105.1.2600.5512
mofd.dll        5.105.1.2600.5512
msiprov.dll        5.105.1.2600.0
ncprov.dll        5.105.1.2600.5512
ntevt.dll        5.105.1.2600.5512
policman.dll        5.105.1.2600.5582
provthrd.dll        5.105.1.2600.5512
repdrvfs.dll        5.105.1.2600.5512
scrcons.exe        5.105.1.2600.5512
smtpcons.dll        5.105.1.2600.0
stdprov.dll        5.105.1.2600.5512
tmplprov.dll        5.105.1.2600.0
trnsprov.dll        5.105.1.2600.0
unsecapp.exe        5.105.1.2600.0
updprov.dll        5.105.1.2600.0
viewprov.dll        5.105.1.2600.5512
wbemads.dll        5.105.1.2600.0
wbemcntl.dll        5.105.1.2600.5512
wbemcomn.dll        5.105.1.2600.5512
wbemcons.dll        5.105.1.2600.5512
wbemcore.dll        5.105.1.2600.5512
wbemdisp.dll        5.105.1.2600.5512
wbemess.dll        5.105.1.2600.5512
wbemperf.dll        5.105.1.2600.5512
wbemprox.dll        5.105.1.2600.5512
wbemsvc.dll        5.105.1.2600.5512
wbemtest.exe        5.105.1.2600.5512
wbemupgd.dll        5.105.1.2600.5512
winmgmt.exe        5.105.1.2600.0
winmgmtr.dll        5.105.1.2600.0
wmiadap.exe        5.105.1.2600.5512
wmiapres.dll        5.105.1.2600.5512
wmiaprpl.dll        5.105.1.2600.5512
wmiapsrv.exe        5.105.1.2600.5512
wmic.exe        5.105.1.2600.5512
wmicookr.dll        5.105.1.2600.5512
wmidcprv.dll        5.105.1.2600.5512
wmimsg.dll        5.105.1.2600.0
wmipcima.dll        5.105.1.2600.5512
wmipdskq.dll        5.105.1.2600.5512
wmipicmp.dll        5.105.1.2600.0
wmipiprt.dll        5.105.1.2600.5512
wmipjobj.dll        5.105.1.2600.5512
wmiprov.dll        5.105.1.2600.5512
wmiprvsd.dll        5.105.1.2600.5755
wmiprvse.exe        5.105.1.2600.5755
wmipsess.dll        5.105.1.2600.5512
wmisvc.dll        5.105.1.2600.5512
wmitimep.dll        5.105.1.2600.0
wmiutils.dll        5.105.1.2600.5512



Может дело в .NET 3.5 SP1 (с текущими на данный момент обновлениями)?

Petya V4sechkin 23-11-2011 11:05 1801493

boss911, попробуйте отключить антивирус/файрвол (если установлен).
А также с помощью Msconfig отключить сторонние (не Microsoft) программы и службы из автозагрузки.

Цитата:

fastprox.dll 5.105.1.2600.5755
policman.dll 5.105.1.2600.5582
wmiprvsd.dll 5.105.1.2600.5755
wmiprvse.exe 5.105.1.2600.5755
Для эксперимента замените их на SP3-версии 5.1.2600.5512

boss911 23-11-2011 11:14 1801502

Petya V4sechkin

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

ОШИБКА:
Код = 0x80070422
Описание = Указанная служба не может быть запущена, поскольку она отключена или все связанные с ней
устройства отключены.
Услуга = Win32

Я так полагаю, сработало. А теперь вот в какую сторону копать, что же такое мешает?

Цитата:

Цитата Petya V4sechkin
Для эксперимента замените их на SP3-версии 5.1.2600.5512 »

Это еще актуально, судя по тому, что описал выше?

Petya V4sechkin 23-11-2011 15:17 1801692

Цитата:

Цитата boss911
Я так полагаю, сработало.

Нет, скорее всего, при "диагностическом запуске" служба "Инструментарий управления Windows" была отключена (надо включить).

Цитата:

Цитата boss911
Это еще актуально

Ну да, желательно выяснить, почему WMI не работает.

El Sanchez 23-11-2011 19:43 1801906

Цитата:

Цитата boss911
Все сделал по инструкции »

Цитата:

Цитата Petya V4sechkin
служба "Инструментарий управления Windows" была отключена »

boss911, из всей той инструкции помогает только метод с перерегистрацией dll, но удалять репозиторий желательно (выяснил экспериментальным путем) и при отключенной службе "Инструментарий управления Windows". В запущенных случаях делаю так:
Код:

< nul Set /P "Str=Останов службы "Инструментарий управления Windows"..."
(SC Config winmgmt start= demand 1>nul 2>&1
Net Stop winmgmt /yes 1>nul 2>&1)&&Echo Done||Echo Failure

< nul Set /P "Str=Пересоздание репозитория CIM..."
(For /F "Tokens=*" %%A In ('Dir /B /AD "%WinDir%\System32\wbem\*Repository*"') Do RD /S /Q "%WinDir%\System32\wbem\%%A" 1>nul 2>&1
For /F "Tokens=*" %%A In ('Dir /B /A-D "%WinDir%\System32\wbem\*.dll"') Do Regsvr32 -s "%WinDir%\System32\wbem\%%A" 1>nul 2>&1)&&Echo Done||Echo Failure

После чего служба "Инструментарий управления Windows" должна сама запуститься.

boss911 24-11-2011 00:23 1802070

Цитата:

Цитата Petya V4sechkin
Для эксперимента замените их на SP3-версии 5.1.2600.5512 »

Заменил, не помогло.

Цитата:

Цитата El Sanchez
из всей той инструкции помогает только метод с перерегистрацией dll, но удалять репозиторий желательно и при отключенной службе "Инструментарий управления Windows". »

Я так и делал, только сверху еще переустанавливал через INI. Только что попробовал ваш код и перезагрузился, проблема с WMIC на месте.

Petya V4sechkin 24-11-2011 09:58 1802192

Цитата:

Цитата boss911
В msconfig я выбрал диагностический запуск, оно закричало, что не хватает прав остановить там какую-то службу и попросило, чтобы я зашел по админом

  1. Что-то препятствует нормальной работе Msconfig, обычно антивирус/файрвол (самозащита) или кривая служба (типа "Pml Driver HPZ12" от принтера HP).
  2. "Диагностический запуск" не надо.
    Надо:

    Цитата:

    Цитата Petya V4sechkin
    отключить сторонние (не Microsoft) программы и службы из автозагрузки


Цитата:

Цитата boss911
Неизвестное исключительное состояние WMIC.

  1. Какие строки добавляются в логи в папке \WINDOWS\system32\wbem\Logs при возникновении этой ошибки?
  2. Еще можно с помощью Process Monitor помониторить (что происходит при ошибке), выложите лог (меню File -> Save) в архиве на любой файлообменник.

boss911 24-11-2011 13:25 1802345

Цитата:

Цитата Petya V4sechkin
отключить сторонние (не Microsoft) программы и службы из автозагрузки »

Отключил всю автозагрузку, отключил все службы не относящейся к Microsoft, я даже отключал все службы, кроме "Инструментарий управления Windows", все равно получаю эту ошибку. С этими экспериментами убил KIS12 (не хочет интерфейс загружаться, пришлось снести).

Логи wbem, логи Process Monitor.

Проверил код у друга, у него работает. У него моя сборка XP SP3 VL + годичный UpdatePack (с тех пор обновы никакие не ставились) и очень похожий набор софта, как у меня, только у него, так же годичный NET 3.5 SP1.

Petya V4sechkin 25-11-2011 10:15 1802943

boss911, пока что в логе Process Monitor заметил две странности:
1. Обращение к библиотеке C:\WINDOWS\system32\HookDll.dll (непонятно, к чему она относится).

2. Сразу две загруженных библиотеки:
  • C:\Program Files\AVerTV\msxml3.dll (версия 8.20.8730.1)
  • C:\WINDOWS\system32\msxml3.dll (версия 8.100.1052.0)
Первая в папке \Program Files\AVerTV явно не к месту.
Впечатление такое, что WMIC.exe после обращения к ней завершает работу (идут операции Thread Exit).

boss911 25-11-2011 11:52 1803007

Цитата:

Цитата Petya V4sechkin
C:\Program Files\AVerTV\msxml3.dll »

Дарегил библиотеку и перерегистрировал C:\WINDOWS\system32\msxml3.dll , код заработал. Все же докопались, спасибо огромное.

Я так понимаю, разрабы AverTV 5.5.0.25 криво написали инсталлятор, по идеи тот должен был проверить наличие в системе msxml3.dll и если его нет, ставить и регистрировать из своего дистрибутива. Теперь придется ковырять их MSI (удалять его от туда). В папке AverTV есть еще msxml3a.dll и msxml3r.dll (у них нет DllRegisterServer), я так понял, это часть MSXML3, только не понятно, что за файл "а", их тоже грохать?

Насколько я понял, WMIC зависит от MSXML3, а у всех ли есть MSXML3, на каких ОС и на всех ли SP? В чистом XP SP3, точно знаю, что в составе есть.

boss911 25-11-2011 13:49 1803102

Имеется два сетевых интерфейса:
Код:

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

Использую код:
Код:

for /f "tokens=2 delims==" %%a in ('wmic path Win32_networkadapter where ^"NetConnectionStatus^=2^" get NetConnectionID /value') do set NETWORK=%%a

echo %NETWORK%

В таком случае имя будет получено "Подключение по локальной сети 2". Вообще-то, в других случаях, оно всегда берет первое по списку имя, но не в этом случае, оно зараза берет второе по списку подключение - "Подключение по локальной сети 2" и хоть тресни, не понятно чего.

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

Iska 25-11-2011 17:47 1803297

boss911, для получения нужной сортировки используйте «sort.exe». Но, думаю, дело не в этом.

Petya V4sechkin 25-11-2011 18:31 1803341

Цитата:

Цитата boss911
В папке AverTV есть еще msxml3a.dll и msxml3r.dll (у них нет DllRegisterServer), я так понял, это часть MSXML3, только не понятно, что за файл "а", их тоже грохать?

Это ресурсные библиотеки, на систему уже не повлияют (если ссылок в реестре нет).

Цитата:

Цитата boss911
WMIC зависит от MSXML3

Судя по логу, использует для парсинга XSL-файлов в папке \WINDOWS\system32\wbem
От MSXML3 вообще много что зависит (например, IE и MMC).

Цитата:

Цитата boss911
у всех ли есть MSXML3, на каких ОС и на всех ли SP?

Список версий модулей синтаксического анализа XML Microsoft (MSXML)

Цитата:

Цитата boss911
Все же докопались, спасибо огромное.

Не за что :)
Любопытный случай (казалось бы, при чем тут WMIC и AverTV). Можно (было бы) писать статью типа "Дело о неработающем WMIC" (в стиле Марка Руссиновича).

El Sanchez 25-11-2011 18:39 1803347

Цитата:

Цитата boss911
Вообще-то, в других случаях, оно всегда берет первое по списку имя »

Сначала первую строку вывода, потом вторую и т.д. и в конце цикла переменная %a будет содержать значение последней строки вывода for. Поэтому:
Код:

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%


Iska 25-11-2011 19:38 1803405

Цитата:

Цитата Petya V4sechkin
Любопытный случай (казалось бы, при чем тут WMIC и AverTV). Можно (было бы) писать статью типа "Дело о неработающем WMIC" (в стиле Марка Руссиновича). »

Я бы не отказался почитать Ваши статьи.


Цитата:

Цитата El Sanchez
Поэтому: »

El Sanchez, это даже лучше, нежели было здесь. Для коротких циклов (понятно, что длинные циклы разбора многомегабайтных файлов быстрее будет — прерывать) самое оно. Пошло в «Избранное».

boss911 26-11-2011 01:21 1803584

Цитата:

Цитата Petya V4sechkin
Любопытный случай (казалось бы, при чем тут WMIC и AverTV). »

Да тут дело не в AverTV, а более глобально - в криво написанных инсталляторах. Оно обязано проверить наличие нужной версии MSXML и только потом ставить или не ставить, иначе может быть конфликт версий, что приводит к сбоям в приложениях, что у меня и произошло. Ковырнул я их MSI, выдрал эти файлы, теперь больше не гадит при установке.


Цитата:

Цитата El Sanchez
Сначала первую строку вывода, потом вторую и т.д. и в конце цикла переменная %a будет содержать значение последней строки вывода for. »

Я бы не сказал. Например, имеем:
Код:

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

оно всегда будет брать последнее. Провел эксперимент: назвал "Lan" и "Lan 2", оно взяло первое, потом я называл подключения по-разному, оно всегда брало первое по имени подключение, которое идет первым по списку, что логично (правда я тогда пробовал другой код, так как тогда у меня WMIC не работал). Мне, в принципе, так и нужно, чтобы брало всегда первое по списку имен подключение.

Спасибо. Сейчас нет возможности проверить ваш код (у меня одна сетевая), появится возможность, проверю и отпишусь. Только что проверил, теперь все работает, как мне нужно, еще раз спасибо.

boss911 26-11-2011 05:16 1803630

El Sanchez

К сожалению, это метод работает по-разному. Если у меня между "Подключение" и "Подключение 2" выбирается первое, то на другом компе уже выбирается второе. Если использовать этот код, то ситуация уже совсем противоположна будет. Я не понимаю, из-з чего это зависит. То есть, нет четкой уверенности, что всегда будет выбрано первое подключение по списку имен.

Дело в том, что на каждом компьютере по-разному выводит порядок NetConnectionID, если у меня так выводит:
Код:

NetConnectionID=Подключение 2
NetConnectionID=Подключение

то на другом компе порядок может быть иным (так оно и есть). Я не понимаю, из-з чего это зависит.

Если это возможно, помогите решить этот вопрос. Как к этому прикрутить SORT.EXE я не знаю.

Iska 26-11-2011 06:08 1803634

Код:

for /f "tokens=2 delims==" %%a in (
        'wmic path Win32_networkadapter get NetConnectionID /value ^| sort.exe'
) do echo %%a

Результат…
Код:

1394-соединение
Подключение по локальной сети 2
Подключение по локальной сети 6
Подключение по локальной сети



На вышеприведённом коде сие будет выглядеть:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set NETWORK=

for /f "tokens=2 delims==" %%a in (
        'wmic path Win32_networkadapter where "NetConnectionStatus=2" get NetConnectionID /value ^| sort.exe'
) do if not defined NETWORK set NETWORK=%%a

echo %NETWORK%

endlocal
exit /b 0


boss911 26-11-2011 11:52 1803688

Код:

for /f "tokens=2 delims==" %%a in (
        'wmic path Win32_networkadapter get NetConnectionID /value ^| sort.exe'
) do echo %%a

Мой результат
Код:

Подключение 2
Подключение


В данном случае, сортировка явно боком работает, аналогично, если названо "Lan" и "Lan 2", первым в списке "Lan 2". Где тут логика или сортировка работает через одно место? Кстати, в вашем примере похожий случай.

El Sanchez 26-11-2011 13:09 1803712

Цитата:

Цитата 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

boss911 26-11-2011 13:26 1803718

El Sanchez

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

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

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

boss911 26-11-2011 22:46 1803958

Цитата:

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

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

Iska 27-11-2011 04:57 1804068

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 1804130

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 1805128

Цитата:

Цитата boss911
Нужно игнорировать "1394" подключение »

boss911, просто нужен правильный запрос:
Код:

WMIC PATH Win32_NetworkAdapter WHERE "NetConnectionStatus=2 and AdapterTypeID=0" GET NetConnectionID /VALUE
P.S. Кстати, у sort.exe есть параметр /r

boss911 29-11-2011 00:17 1805351

El Sanchez

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

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

Iska 29-11-2011 02:21 1805399

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

boss911 29-11-2011 02:42 1805405

Iska

Код:

WMIC PATH Win32_networkadapter WHERE "NetConnectionStatus=2" GET NetConnectionID /VALUE
Результат
Код:

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


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

Цитата:

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

Ключ AdapterTypeID=0 для WMIC не помогает.

Iska 29-11-2011 04:57 1805419

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

El Sanchez 29-11-2011 16:46 1805766

Цитата:

Цитата boss911
Ключ 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 1805963

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

boss911, увы :(.

boss911 30-11-2011 00:03 1806055

Цитата:

Цитата El Sanchez
MSDN говорит, что для 1394-устройств AdapterTypeID=13 »

Я пробовал, получаю "Отсутствуют экземпляры класса".

Цитата:

Цитата El Sanchez
Фильтрацию по имени проводить - последнее дело »

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

El Sanchez 30-11-2011 14:59 1806481

Цитата:

Цитата boss911
Раз другой возможности нет, то выбирать не с чего. Спасибо, работает. Можно сюда добавить еще одну фильтрацию, чтобы фильтровала два и более подключений, например '%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 1806742

El Sanchez, логично. А, может быть, даже наоборот, отсекать, содержащие:
Код:

NetConnectionID                                            PNPDeviceID
1394-соединение                                  V1394\NIC1394\A4B3DB11D800


boss911 01-12-2011 07:11 1807002

Кажись начинают нервы сдавать. Беру этот код (точно рабочий) и меняю в нем строку на эту (пару постов выше):
Код:

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 1807008

boss911, в том скрипте у Вас не указано «@echo off», и, тем не менее, Вы не видите ошибки?! Удваивайте в пакетных файлах символ «%» там, где потребно:
Код:

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

boss911 01-12-2011 09:23 1807040

Цитата:

Цитата Iska
не указано «@echo off» »

Я его просто не указал в своем посте (подразумевая, что его и так все ставят, я так точно), а в тестируемом батнике оно, конечно же, присутствует.

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

El Sanchez 01-12-2011 14:51 1807271


Цитата:

Цитата boss911
не разбираюсь, в каких случаях, где потребно, удваивать знак «%» »

boss911, для просветления кармы:)

boss911 02-12-2011 09:56 1807819

Скрипт
Код:

@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 умеет говорить, что подключений не найдено или оно отключено, чтобы на основании этого выводить свое сообщение?

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

boss911 03-12-2011 23:50 1808786

Цитата:

Цитата Iska
А, может быть, даже наоборот, отсекать, содержащие: »

Только что провел окончательные эксперименты. Все же лучше фильтровать, по крайней мере, в моем случае, чем отсекать что-то одно, просто при фильтрации оно отсекает все не нужного, такое как "1394" и виртуальные подключения (от виртуальных машин), то есть мы получаем реальный (нужный) список LAN устройств, а не всех Ethernet подключений. Еще раз спасибо El Sanchez за такой чудесный способ.

А по вопросу постом выше кто-то сможет помочь, плиз?

El Sanchez 05-12-2011 18:37 1809790

Цитата:

Цитата boss911
Если я отключаю свое подключение, оно говорит "Отсутствуют экземпляры класса." »

boss911, еще бы не писало, для отключенных устройств свойство NetConnectionStatus=4.

P.S. Запустите у себя в консоли
Код:

WMIC PATH Win32_NetworkAdapter WHERE "PNPDeviceID LIKE 'PCI\\VEN%'" GET /VALUE
при влюченном/отключенном устройстве и увидите как меняются значения свойств.

boss911 06-12-2011 05:42 1810073

Цитата:

Цитата El Sanchez
NetConnectionStatus=4 »

У меня отказывается работать - "Отсутствуют экземпляры класса.", даже если подключение включено.

Мне бы вот, чтобы вместо ошибки, оно писало "Сетевое подключение не найдено или оно не подключено". Под ошибкой подразумевается, что подключение отключено или оно вообще не нашло подключений или при другой любой ошибки.

El Sanchez 06-12-2011 15:00 1810358

Цитата:

Цитата El Sanchez
NetConnectionStatus=4 »

Это свойство возвращает 4 на Win7, на WinXP возвращает 0. Знал же ж. В общем для отключенных устройств NetConnectionStatus<>2:
Код:

For /F "Tokens=1* Delims==" %%A In ('WMIC PATH Win32_NetworkAdapter WHERE ^"NetConnectionStatus^!^=2 AND PNPDeviceID LIKE ^'PCI\\VEN%%^'^" GET NetConnectionID /Value 2^>nul^|FindStr .') Do Call Echo.%%B отключено

boss911 07-12-2011 02:24 1810751

El Sanchez

Сетевое подключение включено:
Код:

Подключение по локальной сети отключено
Если отключено, то вообще ничего не пишет.

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

Foreigner 07-12-2011 07:13 1810790

Цитата:

Цитата boss911
Если отключено, то вообще ничего не пишет »

Ну так и проверь переменную:
Код:

@echo off
setlocal

set "wmic=wmic path win32_networkadapter get name, netconnectionstatus /value"
for /f "tokens=*" %%i in (' "%wmic%" ') do 1>nul set "%%i" && call:check
goto:eof

:check

if defined Name 0>nul set /p="%Name% "

if defined NetConnectionStatus (

if not "%NetConnectionStatus%"=="2" (echo disconnected) else (echo connected)

)

for %%i in (Name,NetConnectionStatus) do set "%%i="


boss911 07-12-2011 08:58 1810819

Foreigner

Что-то не так, долго пояснять, лучше посмтотрите сами (подключение включено). В конец батника я добавил PAUSE. Это не весь лог, еще несколько раз я жал любую клавишу.

А может сделать проще. Я напомню, что в своем батнике я буду использовать этот код. Так вот, если в %TemporaryName% не будет найдено 'NetConnectionID', то оно выводит "Отключено" (и pause & exit), если нашло, то батник продолжает работу. Я представляю это сделать через FINDSTR, но боюсь, что не справлюсь или это будет жутко коряво. Прошу помочь именно в этом направлении, плиз.

Foreigner 07-12-2011 19:26 1811164

Цитата:

Цитата boss911
В конец батника я добавил PAUSE »

Конец это goto:eof

boss911 08-12-2011 01:46 1811350

Foreigner

Ах, да, ступил. Но все равно:

Результат
Код:

Attansic L1 Gigabit Ethernet 10/100/1000Base-T Controller connected
Сетевой адаптер 1394 connected
RAS асинхронный адаптер disconnected
Минипорт WAN (L2TP) disconnected
Минипорт WAN (PPTP) disconnected
Минипорт WAN (PPPoE) disconnected
Прямой параллельный порт disconnected
Минипорт WAN (IP) disconnected
Microsoft видео или ТВ подключение disconnected
Kaspersky Anti-Virus NDIS Miniport disconnected
Kaspersky Anti-Virus NDIS Miniport disconnected
Kaspersky Anti-Virus NDIS Miniport disconnected


Мне бы вот так сделать.

El Sanchez 08-12-2011 11:19 1811508

Цитата:

Цитата boss911
Сетевое подключение включено:
Код:
Подключение по локальной сети отключено
Если отключено, то вообще ничего не пишет.
Мне нужно наоборот »

boss911, ясно, символ ! съедается при включении отложенного раскрытия переменных, в результате чего условие уже не то. В вашем скрипте удвойте символ ^ перед ! (должно быть NetConnectionStatus^^!^=2), либо измените так: NetConnectionStatus^<^>2 (сработает независимо от того, включен ли режим или нет)

boss911 08-12-2011 13:00 1811568

El Sanchez

Спасибо, теперь работает. Скажите, а можно вот эту строку:
Код:

FOR /F "Tokens=1* Delims==" %%A IN ('WMIC PATH Win32_NetworkAdapter WHERE ^"NetConnectionStatus^^!^=2 AND PNPDeviceID LIKE ^'PCI\\VEN%%^'^" GET NetConnectionID /VALUE 2^>nul^|FindStr .') DO CALL ECHO Отключено
вписать вместо этой:
Код:

WMIC PATH Win32_NetworkAdapter WHERE "NetConnectionStatus=2 AND PNPDeviceID LIKE 'PCI\\VEN%%'" GET NetConnectionID /VALUE 2>nul >%TemporaryName%
вот из этого кода?

В том плане, чтобы два раза не гонять WMIC. Если подключение отключено, то оно выводит "Отключено", если все в порядке, то записывает имя подключения в %TemporaryName%. Мне немного стыдно, но чего-то не могу сообразить как.

Guman 09-04-2012 20:36 1896551

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



Как можно командной строкой изменить имя сетевого интерфейса ?
и еще условыя такие...
Неизвестно текущее имя интерфейса и надо независимо от того как они у кого названы переименовать в новое.

Т.е. команда по выводу текущего имени и переименовании на новую которую ми хотим и после этого только уже настраивать так как нужно зная уже конкретное имя..


в итоге хочу применитьвот эти команды..
netsh interface ipv4 set address name="Новое_название" source=static addr=10.177.188.24 mask=255.255.254.0 gateway=10.177.188.1
netsh interface ipv4 set address "Новое_название" static 10.177.188.24 255.255.254.0 10.177.188.1
route add -p 0.0.0.0 mask 255.255.254.0 10.177.188.1

все это должно работать универсально как на XP так и на 7... желательно организовать в cmd файлике..

очень надеюсь на вашу помощь...

вот здесь осужали по этому по поводу но ни как ни че не получилось
http://social.technet.microsoft.com/...a-aa20152c93b7

поделитесь пож рабочим кодом

ergis@vk 22-08-2013 17:11 2205703

Приветствую.
Задача такова:
Имена компьютеров вида E1-x, гдe x - числовое значение от 1 до 30
IP адрес напрямую зависит от имени компьютера, и его присвоение хотелось бы автоматизировать.

Set i="100+%computername:~0,3%"
netsh interface ip set address "Подключение по локальной сети" static 192.168.0.%i% 255.255.255.0 192.168.0.10 0

Понимаю, что ошибка тут: ...92.168.0.1%i%... Но не понимаю, как правильно.
Заранее спасибо за науку.

Petya V4sechkin 22-08-2013 17:29 2205712

Цитата:

Цитата ergis@vk
вида E1-x, гдe x - числовое значение от 1 до 30

E1, E2, ..., E30 - правильно я понял?
Тогда:
Код:

Set /a i=100+%computername:~1%
netsh interface ip set address "Подключение по локальной сети" static 192.168.0.%i% 255.255.255.0 192.168.0.10 0

Если вы имели в виду E1-1, E1-2, ..., E1-30, то:
Код:

Set /a i=100+%computername:~3%
netsh interface ip set address "Подключение по локальной сети" static 192.168.0.%i% 255.255.255.0 192.168.0.10 0


ergis@vk 22-08-2013 17:36 2205716

Огромное спасибо.
Всё оказалось так просто...


Время: 06:35.

Время: 06:35.
© OSzone.net 2001-