Что нового

Парсинг данных, возвращаемых netsh

k790

Новичок
Сообщения
239
Репутация
1
А как сделать парсинг для
Код:
#include <Encoding.au3>
#Include <process.au3>

$rc = _RunDos("netsh interface ip show address > D:\Архив\AutoIt\1.txt")

$coding_866_1251_f=FileOpen ( "D:\Архив\AutoIt\1.txt") 
$sUTF8_String = _Encoding_OEM2ANSI($coding_866_1251_f)
$Encoding=FileOpen ("D:\Архив\AutoIt\2.txt", 1)

While 1
    $line = FileReadLine($coding_866_1251_f)
    If @error = -1 Then ExitLoop
    $Encoding_line1=_Encoding_OEM2ANSI($line)
    $Encoding_line_read=FileWriteLine ($Encoding, $Encoding_line1)
Wend


Смысл в том, чтобы получить конкретные адреса и имена сетевух.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Re: [Данные, строки] Поиск им нужных значений

Код:
$s_Read = ''
$i_PID = Run('ipconfig','',@SW_HIDE,6)
While 1
    $s_Read &= StdoutRead($i_PID)
    If @error Then ExitLoop
    Sleep(1)
WEnd
$str=StringRegExp($s_Read,'(.*)\s-.*?адаптер:(?s).*?IP-(?-s).*:\s([0-9.]+)',3)
$res=''
For $i=0 To UBound($str)-1 Step 2
	$res&=$str[$i]&'='&$str[$i+1]&@CRLF
Next
MsgBox(0,'',$res)
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Re: [Данные, строки] Поиск им нужных значений

sngr
Извини, но твой код не подходит!
ipconfig и ipconfig /all не всё отображают.

Поэтому я использую netsh interface ip show address
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Re: [Данные, строки] Поиск им нужных значений

Код:
#include <Encoding.au3>
#include <Array.au3>
$sOut = ''
$hRun = Run('netsh interface ip show address', '', @SW_HIDE, 6)
Do
	$sOut &= StdoutRead($hRun)
Until @error
$aResult = StringRegExp(_Encoding_OEM2ANSI($sOut), '(?s)"(.+?)".+?((?:\d+\.?){4})', 3)
_ArrayDisplay($aResult)
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Re: [Данные, строки] Поиск им нужных значений

Redline
А если мне надо все данные (ip, маска под сети, основной шлюз и DNS'ы)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Re: [Данные, строки] Поиск им нужных значений

k790
ipconfig /all как раз выводит все подробные сведения и адрес и маску и шлюз и днс-сервера. по крайней мере у меня так ;)
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Re: [Данные, строки] Поиск им нужных значений

joiner
У меня нетбук, сейчас сижу по wi-fi и у меня нету адресов lan!

Нетбук исправен, OS: xp.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Данные, строки] Поиск им нужных значений

k790 [?]
У меня нетбук, сейчас сижу по вайфай и у меня нету адресов лан!
Нетбук исправен, ОС xp.

Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Администратор.
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Re: [Данные, строки] Поиск нужных значений

Как искать ip, dns, default getway, mask ? Какая маска должна быть (маска StringRegExp)
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Re: [Данные, строки] Поиск нужных значений

Вот так, при условии, что для каждого адаптера выдается одно и тоже количество параметров:
Код:
#include <Encoding.au3>
#include <Array.au3>
$sOut = ''
$hRun = Run('netsh interface ip show address', '', @SW_HIDE, 6)
Do
	$sOut &= StdoutRead($hRun)
Until @error
$sOut = _Encoding_OEM2ANSI($sOut)
ConsoleWrite($sOut & @CRLF)
$aResult1 = StringRegExp($sOut, '\s+(.+?):\s+(.+?)\r+', 3)
$aResult2 = StringRegExp($sOut, '"(.+?)"', 3)
$iParams = UBound($aResult1)/(UBound($aResult2))/2
$iCounter = 0
Dim $aResult[UBound($aResult1)/2 + UBound($aResult2)][2]
For $i = 0 To UBound($aResult2) - 1
	$aResult[$iCounter][0] = 'Адаптер'
	$aResult[$iCounter][1] = $aResult2[$i]
	$iCounter += 1
	For $j = 0 To ($iParams - 1)*2 Step 2
		$aResult[$iCounter][0] = $aResult1[$iParams*$i + $j]
		$aResult[$iCounter][1] = $aResult1[$iParams*$i + $j + 1]
		$iCounter += 1
	Next
Next
_ArrayDisplay($aResult)

DNS здесь не выдается, но можно посмотреть в сторону nslookup 127.0.0.1
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Re: [Данные, строки] Поиск нужных значений

Redline [?]
DNS здесь не выдается
Можно узнать командой netsh interface ip show dns
А ты сможешь мне объяснить какие переменные что делают.

Может проще показать куда мне это надо?
Код:
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=D:\Архив\ICONVISTA\ip.ico
#AutoIt3Wrapper_Res_Comment=Sergey
#AutoIt3Wrapper_Res_Description=Barbayanov
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=007
#AutoIt3Wrapper_Res_Language=1049
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3> 
#include <GuiIPAddress.au3>
#include <GuiComboBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Process.au3>

#Region ### START Koda GUI section ### Form=смена ip.kxf
$Form1_1 = GUICreate("Change IP-address ", 207, 470, 444, 32)
$Combo1 = GUICtrlCreateCombo("", 8, 8, 185, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
$Combo2 = GUICtrlCreateCombo("", 8, 40, 185, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL))
$Radio1 = GUICtrlCreateRadio("Получить IP и DNS сервера авто", 8, 98, 193, 17)
$Radio2 = GUICtrlCreateRadio("Использовать свои настройки", 8, 122, 185, 17)
$Radio3 = GUICtrlCreateRadio("Закладки", 8, 72, 177, 17)
$IPAddress1 = _GUICtrlIpAddress_Create($Form1_1, 42, 166, 113, 17)
_GUICtrlIpAddress_Set($IPAddress1, "0.0.0.0")
$IPAddress2 = _GUICtrlIpAddress_Create($Form1_1, 42, 216, 113, 17)
_GUICtrlIpAddress_Set($IPAddress2, "0.0.0.0")
$IPAddress3 = _GUICtrlIpAddress_Create($Form1_1, 42, 265, 113, 17)
_GUICtrlIpAddress_Set($IPAddress3, "0.0.0.0")
$IPAddress4 = _GUICtrlIpAddress_Create($Form1_1, 42, 339, 113, 17)
_GUICtrlIpAddress_Set($IPAddress4, "0.0.0.0")
$IPAddress5 = _GUICtrlIpAddress_Create($Form1_1, 42, 387, 113, 17)
_GUICtrlIpAddress_Set($IPAddress5, "0.0.0.0")
$Group1 = GUICtrlCreateGroup("", 16, 136, 169, 162)
$Label1 = GUICtrlCreateLabel("IP адрес:", 26, 149, 50, 17)
$Label2 = GUICtrlCreateLabel("Маска подсети:", 26, 199, 84, 17)
$Label3 = GUICtrlCreateLabel("Основной шлюз:", 26, 248, 88, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlSetState(-1, $GUI_DISABLE)
$Group2 = GUICtrlCreateGroup("DNS сервера", 16, 301, 169, 113)
$Label4 = GUICtrlCreateLabel("Предпочитаемый DNS сервер", 26, 322, 157, 17)
$Label5 = GUICtrlCreateLabel("Альтернативный DNS сервер", 26, 370, 154, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button1 = GUICtrlCreateButton("Пуск", 32, 426, 137, 33)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


Global $avArray
$n=0
$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$colItems = ""
$strComputer = "localhost"

$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter", "WQL",  $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
$avArray = _ArrayCreate("")
If IsObj($colItems) then
   For $objItem In $colItems
if $objItem.NetConnectionID<>'' then _ArrayAdd ( $avArray, $objItem.NetConnectionID)
   Next
Endif


For $i=1 to UBound($avArray)-1 Step 1
   
GUICtrlSetData ($Combo1, $avArray[$i])
_GUICtrlComboBox_SetCurSel($combo1, $avArray[1])
Next
;_ArrayDisplay($avArray)
;msgBox(0,"", UBound($avArray))


$var = IniReadSectionNames("config.ini")

For $i=UBound($var)-1 to 1 Step -1
$var1 = IniRead ( "config.ini", $var[$i], "name", "default" ) 

GUICtrlSetData ($Combo2, $var1)
_GUICtrlComboBox_SetCurSel($combo2, $var[1])
Next

Func _ip_config_1()
   If GUICtrlRead ($Radio3) = $GUI_CHECKED then
			$name_c=GUICtrlRead ($Combo2)
			$ip_a = IniRead ( "config.ini", $name_c, "ip", "0.0.0.0" ) 
			$mask_a=IniRead ( "config.ini", $name_c, "mask", "0.0.0.0" ) 
			$gatewey_a=IniRead ( "config.ini", $name_c, "gateway", "0.0.0.0" ) 
			$dns_a=IniRead ( "config.ini", $name_c, "dns1", "0.0.0.0" ) 
			$dns2_a=IniRead ( "config.ini", $name_c, "dns2", "0.0.0.0" ) 
;			GUICtrlSetData ($IPAddress1, $ip_a)
			   _GUICtrlIpAddress_Set($IPAddress1, $ip_a)
			   
;			GUICtrlSetData ($IPAddress2, $mask_a)
			   _GUICtrlIpAddress_Set($IPAddress2, $mask_a)
			   
;			GUICtrlSetData ($IPAddress3, $gatewey_a)
			   _GUICtrlIpAddress_Set($IPAddress3, $gatewey_a)
			   
;			GUICtrlSetData ($IPAddress4, $dns_a)
			   _GUICtrlIpAddress_Set($IPAddress4, $dns_a)
			   
;			GUICtrlSetData ($IPAddress5, $dns2_a)
			   _GUICtrlIpAddress_Set($IPAddress5, $dns2_a)
			   endif
EndFunc

Func _ip_config_2()
			GUICtrlSetState ( $Combo2, $GUI_ENABLE)
			GUICtrlSetState ( $IPAddress1, $GUI_DISABLE)
			GUICtrlSetState ( $IPAddress2, $GUI_DISABLE)
			GUICtrlSetState ( $IPAddress3, $GUI_DISABLE)
			GUICtrlSetState ( $IPAddress4, $GUI_DISABLE)
			GUICtrlSetState ( $IPAddress5, $GUI_DISABLE)

EndFunc


While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg

	    Case $Radio1
			GUICtrlSetState ( $IPAddress1, $GUI_DISABLE)
			GUICtrlSetState ( $IPAddress2, $GUI_DISABLE)
			GUICtrlSetState ( $IPAddress3, $GUI_DISABLE)
			GUICtrlSetState ( $IPAddress4, $GUI_DISABLE)
			GUICtrlSetState ( $IPAddress5, $GUI_DISABLE)
			GUICtrlSetState ( $Combo2, $GUI_DISABLE)

	    Case $Radio2
			GUICtrlSetState ( $IPAddress1, $GUI_ENABLE)
			GUICtrlSetState ( $IPAddress2, $GUI_ENABLE)
			GUICtrlSetState ( $IPAddress3, $GUI_ENABLE)
			GUICtrlSetState ( $IPAddress4, $GUI_ENABLE)
			GUICtrlSetState ( $IPAddress5, $GUI_ENABLE)
			GUICtrlSetState ( $Combo2, $GUI_DISABLE)

	    Case $Radio3
		   _ip_config_1()
		   _ip_config_2()
	    Case $Combo2
			_ip_config_1()
			_ip_config_2()

		Case $Button1
			GUICtrlSetState ( $Button1, $GUI_DISABLE)
		   $name_a=GUICtrlRead ($Combo1)
			If GUICtrlRead($Radio2) = $GUI_CHECKED Then
			   $name_a=GUICtrlRead ($Combo1)
			   $ip_a=_GUICtrlIpAddress_Get($IPAddress1)
			   $mask_a=_GUICtrlIpAddress_Get($IPAddress2)
			   $gatewey_a=_GUICtrlIpAddress_Get($IPAddress3)
			   $dns_a=_GUICtrlIpAddress_Get($IPAddress4)
			   $dns2_a=_GUICtrlIpAddress_Get($IPAddress5)
			   
			   $ip="netsh interface ip set address name=""" & $name_a & """ source=static addr=" & $ip_a & " mask=" & $mask_a & " gateway=" & $gatewey_a & " gwmetric=1"
			   $dns="netsh interface ip set dns name=""" & $name_a & """ source=static addr=" & $dns_a 
			   $dns2="netsh interface ip add dns """ & $name_a & """ " & $dns2_a

			   _RunDOS($ip)
			   _RunDOS($dns)
			   _RunDOS($dns2)
			endif

			If GUICtrlRead($Radio1) = $GUI_CHECKED Then
			    
				$ip="netsh interface ip set address name=""" & $name_a & """ source=dhcp"
				$dns="netsh interface ip set dns name=""" & $name_a & """ source=dhcp"
			   _RunDOS($ip)
			   _RunDOS($dns)
			endif

			If GUICtrlRead($Radio3) = $GUI_CHECKED Then
			   $name_a=GUICtrlRead ($Combo1)
			$name_c=GUICtrlRead ($Combo2)
			$ip_a = IniRead ( "config.ini", $name_c, "ip", "0.0.0.0" ) 
			$mask_a=IniRead ( "config.ini", $name_c, "mask", "0.0.0.0" ) 
			$gatewey_a=IniRead ( "config.ini", $name_c, "gateway", "0.0.0.0" ) 
			$dns_a=IniRead ( "config.ini", $name_c, "dns1", "0.0.0.0" ) 
			$dns2_a=IniRead ( "config.ini", $name_c, "dns2", "0.0.0.0" ) 
			   $ip="netsh interface ip set address name=""" & $name_a & """ source=static addr=" & $ip_a & " mask=" & $mask_a & " gateway=" & $gatewey_a & " gwmetric=1"
			   $dns="netsh interface ip set dns name=""" & $name_a & """ source=static addr=" & $dns_a 
			   $dns2="netsh interface ip add dns """ & $name_a & """ " & $dns2_a
			   _RunDOS($ip)
			   _RunDOS($dns)
			   _RunDOS($dns2)
endif
			GUICtrlSetState ( $Button1, $GUI_ENABLE)

		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd


Если вставлять в мой скрипт, то это нужно при запуске скрипта показывать текущие ip (менять адреса, если меняю название сетевух - верхнее combo) и когда нажимаю на "Использовать свои настройки".

Буду благодарен
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Re: [Данные, строки] Поиск нужных значений

Все эти параметры проще всего получить через netsh interface ip dump, но парсить его это просто ад.
Поэтому проще несколько раз вызвать netsh для каждого адаптера.

О-хо-хо, код конечно тот еще, замечания:
1. Нельзя показывать пользователю GUI и одновременно наполнять его: GUISetState(@SW_SHOW) нужно делать в самый последний момент.
2. Функции лучше располагать после главного цикла скрипта.
3. _GUICtrlIpAddress_... не реагирует на GUICtrlSetState(.., $GUI_DISABLE), нужно применять WinSetState
4. Параметры из ini лучше считать единожды, дабы не дергать файл каждый раз.
5. Если путь до файла лучше хранить в переменной: в случае изменения имени/пути файла его нужно будет исправить только в одном месте.
6. Номера radio идут не по порядку - это вносит путаницу (это не исправлял).

Переделки:
Параметры текущих подключений и настроек из ini хранятся в одном массиве.
Заполнение полей вынес в отдельную функцию.
Если dns или ip получаются автоматически по DHCP, то в качестве этих параметров идут "0.0.0.0" - нужно добавить обработку таких строк.
DNS-ов может быть больше 2-х, в GUI попадают первые два или один, если второй не задан.

Советую также сделать блокировку второго combo и верхнего radio, если ini-файл не найден или не содержит нужных параметров.

Вот результат переделки:
Код:
#NoTrayIcon
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=D:\Архив\ICONVISTA\ip.ico
#AutoIt3Wrapper_Res_Comment=Sergey
#AutoIt3Wrapper_Res_Description=Barbayanov
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=007
#AutoIt3Wrapper_Res_Language=1049
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <GuiIPAddress.au3>
#include <GuiComboBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Process.au3>
#include <Encoding.au3>

#region ### START Koda GUI section ### Form=смена ip.kxf
$Form1_1 = GUICreate("Change IP-address ", 207, 470, 444, 32)
$Combo1 = GUICtrlCreateCombo("", 8, 8, 185, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
$Combo2 = GUICtrlCreateCombo("", 8, 40, 185, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
GUICtrlSetState(-1, $GUI_DISABLE)
$Radio1 = GUICtrlCreateRadio("Получить IP и DNS сервера авто", 8, 98, 193, 17)
$Radio2 = GUICtrlCreateRadio("Использовать свои настройки", 8, 122, 185, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Radio3 = GUICtrlCreateRadio("Закладки", 8, 72, 177, 17)
$IPAddress1 = _GUICtrlIpAddress_Create($Form1_1, 42, 166, 113, 17)
$IPAddress2 = _GUICtrlIpAddress_Create($Form1_1, 42, 216, 113, 17)
$IPAddress3 = _GUICtrlIpAddress_Create($Form1_1, 42, 265, 113, 17)
$IPAddress4 = _GUICtrlIpAddress_Create($Form1_1, 42, 339, 113, 17)
$IPAddress5 = _GUICtrlIpAddress_Create($Form1_1, 42, 387, 113, 17)
$Group1 = GUICtrlCreateGroup("", 16, 136, 169, 162)
$Label1 = GUICtrlCreateLabel("IP адрес:", 26, 149, 50, 17)
$Label2 = GUICtrlCreateLabel("Маска подсети:", 26, 199, 84, 17)
$Label3 = GUICtrlCreateLabel("Основной шлюз:", 26, 248, 88, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlSetState(-1, $GUI_DISABLE)
$Group2 = GUICtrlCreateGroup("DNS сервера", 16, 301, 169, 113)
$Label4 = GUICtrlCreateLabel("Предпочитаемый DNS сервер", 26, 322, 157, 17)
$Label5 = GUICtrlCreateLabel("Альтернативный DNS сервер", 26, 370, 154, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button1 = GUICtrlCreateButton("Пуск", 32, 426, 137, 33)
#endregion ### END Koda GUI section ###

$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$colItems = ""
$strComputer = "localhost"

Dim $aAdapters[1][6] ; массив для хранения параметров сетевых адаптеров
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
For $objItem In $colItems ;перебор всех адаптеров
	If $objItem.NetConnectionID <> '' Then
		$aAdapters[UBound($aAdapters) - 1][0] = $objItem.NetConnectionID ;сохраняем имя адаптера
		ReDim $aAdapters[UBound($aAdapters) + 1][6]
	EndIf
Next
For $i = 0 To UBound($aAdapters) - 2;поиск сетевых настроек по каждому адаптеру
	$sOut = ''
	$hRun = Run('netsh interface ip show address name="' & $aAdapters[$i][0] & '"', '', @SW_HIDE, 6) ;получение ip, mask & gateway
	Do
		$sOut &= StdoutRead($hRun)
	Until @error
	$sOut = _Encoding_OEM2ANSI($sOut)
	$aIpParams = StringRegExp($sOut, '((?:\d+\.){3}\d+)', 3)
	If IsArray($aIpParams) And UBound($aIpParams) = 3 Then ;если адрес выдается не через DHCP, то заносим их в массив
		For $j = 0 To UBound($aIpParams) - 1
			$aAdapters[$i][$j + 1] = $aIpParams[$j]
		Next
	Else ;DHCP
		For $j = 0 To UBound($aIpParams) - 1
			$aAdapters[$i][$j + 1] = '0.0.0.0'
		Next
	EndIf
	$sOut = ''
	$hRun = Run('netsh interface ip show dns name="' & $aAdapters[$i][0] & '"', '', @SW_HIDE, 6) ;получение адресов DNS
	Do
		$sOut &= StdoutRead($hRun)
	Until @error
	$sOut = _Encoding_OEM2ANSI($sOut)
	$aDNS = StringRegExp($sOut, '((?:\d+\.){3}\d+)', 3)
	If IsArray($aDNS) Then ;если есть хотя бы один DNS-адрес, то заносим превые два из них в массив
		$aAdapters[$i][4] = $aDNS[0]
		If UBound($aDNS) > 1 Then
			$aAdapters[$i][5] = $aDNS[1]
		Else
			$aAdapters[$i][5] = '0.0.0.0'
		EndIf
	Else
		$aAdapters[$i][4] = '0.0.0.0'
		$aAdapters[$i][5] = '0.0.0.0'
	EndIf
Next
$sComboText = ''
For $i = 0 To UBound($aAdapters) - 2
	If $sComboText <> '' Then $sComboText &= '|'
	$sComboText &= $aAdapters[$i][0]
Next
GUICtrlSetData($Combo1, $sComboText, $aAdapters[0][0])
_fill_from_array($aAdapters[0][0])

$sPathINI = 'c:\config.ini'
$var = IniReadSectionNames($sPathINI)
$sComboText = ''
If IsArray($var) Then
	For $i = 1 To $var[0]
		If $sComboText <> '' Then $sComboText &= '|'
		$sAdName = IniRead($sPathINI, $var[$i], 'name', 'default')
		$sComboText &= $sAdName
		$aAdapters[UBound($aAdapters) - 1][0] = $sAdName
		$aAdapters[UBound($aAdapters) - 1][1] = IniRead($sPathINI, $var[$i], 'ip', '0.0.0.0')
		$aAdapters[UBound($aAdapters) - 1][2] = IniRead($sPathINI, $var[$i], 'mask', '0.0.0.0')
		$aAdapters[UBound($aAdapters) - 1][3] = IniRead($sPathINI, $var[$i], 'gateway', '0.0.0.0')
		$aAdapters[UBound($aAdapters) - 1][4] = IniRead($sPathINI, $var[$i], 'dns1', '0.0.0.0')
		$aAdapters[UBound($aAdapters) - 1][5] = IniRead($sPathINI, $var[$i], 'dns2', '0.0.0.0')
		ReDim $aAdapters[UBound($aAdapters) + 1][6]
	Next
	GUICtrlSetData($Combo2, $sComboText, IniRead($sPathINI, $var[1], 'name', 'default'))
Else
	GUICtrlSetData($Combo2, 'default', 'default')
	$aAdapters[UBound($aAdapters) - 1][0] = 'default'
	$aAdapters[UBound($aAdapters) - 1][1] = '0.0.0.0'
	$aAdapters[UBound($aAdapters) - 1][2] = '0.0.0.0'
	$aAdapters[UBound($aAdapters) - 1][3] = '0.0.0.0'
	$aAdapters[UBound($aAdapters) - 1][4] = '0.0.0.0'
	$aAdapters[UBound($aAdapters) - 1][5] = '0.0.0.0'
	ReDim $aAdapters[UBound($aAdapters) + 1][6]
EndIf

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg

		Case $Radio1
			WinSetState($IPAddress1, '', @SW_DISABLE)
			WinSetState($IPAddress2, '', @SW_DISABLE)
			WinSetState($IPAddress3, '', @SW_DISABLE)
			WinSetState($IPAddress4, '', @SW_DISABLE)
			WinSetState($IPAddress5, '', @SW_DISABLE)
			GUICtrlSetState($Combo2, $GUI_DISABLE)

		Case $Radio2
			WinSetState($IPAddress1, '', @SW_ENABLE)
			WinSetState($IPAddress2, '', @SW_ENABLE)
			WinSetState($IPAddress3, '', @SW_ENABLE)
			WinSetState($IPAddress4, '', @SW_ENABLE)
			WinSetState($IPAddress5, '', @SW_ENABLE)
			GUICtrlSetState($Combo2, $GUI_DISABLE)
			_ip_config_1()

		Case $Radio3
			_ip_config_1()
			GUICtrlSetState($Combo2, $GUI_ENABLE)
		Case $Combo2
			_ip_config_1()

		Case $Button1
			GUICtrlSetState($Button1, $GUI_DISABLE)
			$name_a = GUICtrlRead($Combo1)
			If GUICtrlRead($Radio2) = $GUI_CHECKED Then
				$name_a = GUICtrlRead($Combo1)
				$ip_a = _GUICtrlIpAddress_Get($IPAddress1)
				$mask_a = _GUICtrlIpAddress_Get($IPAddress2)
				$gatewey_a = _GUICtrlIpAddress_Get($IPAddress3)
				$dns_a = _GUICtrlIpAddress_Get($IPAddress4)
				$dns2_a = _GUICtrlIpAddress_Get($IPAddress5)

				$ip = "netsh interface ip set address name=""" & $name_a & """ source=static addr=" & $ip_a & " mask=" & $mask_a & " gateway=" & $gatewey_a & " gwmetric=1"
				$dns = "netsh interface ip set dns name=""" & $name_a & """ source=static addr=" & $dns_a
				$dns2 = "netsh interface ip add dns """ & $name_a & """ " & $dns2_a

				_RunDos($ip)
				_RunDos($dns)
				_RunDos($dns2)
			EndIf

			If GUICtrlRead($Radio1) = $GUI_CHECKED Then

				$ip = "netsh interface ip set address name=""" & $name_a & """ source=dhcp"
				$dns = "netsh interface ip set dns name=""" & $name_a & """ source=dhcp"
				_RunDos($ip)
				_RunDos($dns)
			EndIf

			If GUICtrlRead($Radio3) = $GUI_CHECKED Then
				$name_a = GUICtrlRead($Combo1)
				$name_c = GUICtrlRead($Combo2)
				$ip_a = _GUICtrlIpAddress_Get($IPAddress1)
				$mask_a = _GUICtrlIpAddress_Get($IPAddress2)
				$gatewey_a = _GUICtrlIpAddress_Get($IPAddress3)
				$dns_a = _GUICtrlIpAddress_Get($IPAddress4)
				$dns2_a = _GUICtrlIpAddress_Get($IPAddress5)
				$ip = "netsh interface ip set address name=""" & $name_a & """ source=static addr=" & $ip_a & " mask=" & $mask_a & " gateway=" & $gatewey_a & " gwmetric=1"
				$dns = "netsh interface ip set dns name=""" & $name_a & """ source=static addr=" & $dns_a
				$dns2 = "netsh interface ip add dns """ & $name_a & """ " & $dns2_a
				_RunDos($ip)
				_RunDos($dns)
				_RunDos($dns2)
			EndIf
			GUICtrlSetState($Button1, $GUI_ENABLE)

		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _ip_config_1()
	WinSetState($IPAddress1, '', @SW_ENABLE)
	WinSetState($IPAddress2, '', @SW_ENABLE)
	WinSetState($IPAddress3, '', @SW_ENABLE)
	WinSetState($IPAddress4, '', @SW_ENABLE)
	WinSetState($IPAddress5, '', @SW_ENABLE)
	If GUICtrlRead($Radio3) = $GUI_CHECKED Then
		$name_c = GUICtrlRead($Combo2)
	Else
		$name_c = GUICtrlRead($Combo1)
	EndIf
	_fill_from_array($name_c)
EndFunc   ;==>_ip_config_1

Func _fill_from_array($sSelectedText)
	For $i = 0 To UBound($aAdapters) - 2
		If $aAdapters[$i][0] = $sSelectedText Then
			_GUICtrlIpAddress_Set($IPAddress1, $aAdapters[$i][1])
			If $aAdapters[$i][1] = '0.0.0.0' Then WinSetState($IPAddress1, '', @SW_DISABLE)
			_GUICtrlIpAddress_Set($IPAddress2, $aAdapters[$i][2])
			If $aAdapters[$i][2] = '0.0.0.0' Then WinSetState($IPAddress2, '', @SW_DISABLE)
			_GUICtrlIpAddress_Set($IPAddress3, $aAdapters[$i][3])
			If $aAdapters[$i][3] = '0.0.0.0' Then WinSetState($IPAddress3, '', @SW_DISABLE)
			_GUICtrlIpAddress_Set($IPAddress4, $aAdapters[$i][4])
			If $aAdapters[$i][4] = '0.0.0.0' Then WinSetState($IPAddress4, '', @SW_DISABLE)
			_GUICtrlIpAddress_Set($IPAddress5, $aAdapters[$i][5])
			If $aAdapters[$i][5] = '0.0.0.0' Then WinSetState($IPAddress5, '', @SW_DISABLE)
			ExitLoop
		EndIf
	Next
EndFunc   ;==>_fill_from_array

Модераторы, перенесите тему в стол заказов пожалуйста, там она будет более уместна.
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Re: [Данные, строки] Поиск нужных значений

Redline [?]
1. Нельзя показывать пользователю GUI и одновременно наполнять его: GUISetState(@SW_SHOW) нужно делать в самый последний момент.
Может да, а может и нет. Мне например не очень понравилось ждать пока там скрипт отработает всё (у меня нетбук, а там intel atom 1.6 ГГц, 1 ядро, плохой проц по производительности).
Пока я начну что-то выбирать в программе всё и до грузится.

2. Функции лучше располагать после главного цикла скрипта.
Вопрос, почему именно так? Скрипт сначала выполняет функцию, потом грузит интерфейс и всё такое, а потом ещё раз грузит ф-ию? А так он грузит интерфейс, ф-ию, а потом просто закрывает скрипт и всё?

Но всё-таки не такой уж и плохой код - у меня шустро работал, косяков не было.

У меня вопрос по теме, ip/dns от wi-fi и lan отображаются нормально, а вот VirtualBox Host-Only Network, показывает только основной шлюз и причём другой шлюз.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Данные, строки] Поиск нужных значений

Redline [?]
Модераторы, перенесите тему в стол заказов пожалуйста, там она будет более уместна.
В стол заказов вообще переносить темы не желательно, ведь у автора никаких намерении не было что либо заказывать :smile:.
И кстати в следующий раз, для подобных просьб есть кнопка «Сообщить модератору».

k790
Что касается названия темы...
Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"[Данные, строки] Поиск нужных значений" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Администратор.










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

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
k790 [?]
Функции лучше располагать после главного цикла скрипта.
Вопрос, почему именно так?
C2H5OH [?]
Почему?
think.gif
Конечно, в AutoIt нет строгих правил написания кода, но посмотрите другие скрипты - практически везде функции описываются уже после основного цикла программы просто потому, что новые функции удобнее дописывать именно снизу, а не вклинивать их до цикла. Глаз уже сам ищет функции после цикла (в вашем скрипте) и не находит - это уже дело привычки.

k790 [?]
Скрипт сначала выполняет функцию, потом грузит интерфейс и всё такое, а потом ещё раз грузит ф-ию? А так он грузит интерфейс, ф-ию, а потом просто закрывает скрипт и всё?
Скрипту нет разницы где расположена функция в начале или конце, просто если она вызывается - он ее выполняет. Насколько я понимаю как это работает: скрипт целиком читается в память и выполняется сверху вниз, если при его выполнении встречается вызов функции, то происходит поиск ее описания и она выполняется, а если "на пути" встречается описание функции, то скрипт ничего не делает.

Но всё-таки не такой уж и плохой код - у меня шустро работал, косяков не было.
Хорошо что вас устраивает такой код, я привел замечания, которых лучше придерживаться в дальнейшем, чтобы код был более читаемым не только для вас, а и для других - когда код выкладывается на всеобщее обозрение.
Поверьте в упорядоченном и структурированном коде разбираться проще и приятнее.
И это я еще ничего не сказал о именах переменных ;) - лучше их называть так, чтобы по имени было понятно, что содержит эта переменная, например, $IPAddress4 -> $IP_dns1. А если почитать рекомендации, то $IPAddress4 -> $hIP_dns1

Не принимайте все вышесказанное близко к сердцу - это всего лишь ворчание, недовольного неидеальным миром мизантропа :big_boss:

У меня вопрос по теме, ip/dns от wi-fi и lan отображаются нормально, а вот VirtualBox Host-Only Network, показывает только основной шлюз и причём другой шлюз.
У меня кроме lan ничего нет, покажите что выдает netsh interface ip show config
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
не важно где располагать функции, интерпретатор после чтения скрипта в память образует свой скрипт без комментариев, лишних отступов и располагает функции в начале скрипта. некоторые языки этого не делают (python, например) и функции надо обязательно располагать в начале.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
Run(@ComSpec &' /k wmic nicconfig get index,description');требует прав админа, смотрим index,вставляем в нижний код.

$obj = ObjGet("WinMgmts:\\.\root\cimv2")
$que=$obj.get("Win32_NetworkAdapterConfiguration.index=8")
Global $ip,$gat,$mask,$dns
For $o In $que.ipaddress
	$ip&=$o&@CRLF
Next
For $o In $que.DefaultIPGateway
	$gat&=$o&@CRLF
Next
For $o In $que.IPSubnet
	$mask&=$o&@CRLF
Next
For $o In $que.DNSServerSearchOrder
	$dns&=$o&@CRLF
Next
MsgBox(0,'','ip='&$ip&@CRLF&'mask='&$mask&@CRLF&'gathway='&$gat&@CRLF&'dns='&$dns)
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Redline [?]
что выдает netsh interface ip show config
Ќ бва®©Є Ё­вҐа䥩б "Џ®¤Є«о祭ЁҐ Ї® «®Є «м­®© бҐвЁ"
DHCP а §аҐиҐ­: ЌҐв
IP- ¤аҐб: 192.168.1.251
Њ бЄ Ї®¤бҐвЁ: 255.255.255.0
Ћб­®ў­®© и«о§: 192.168.1.1
ЊҐваЁЄ и«о§ : 0
ЊҐваЁЄ Ё­вҐа䥩б : 0
‘в вЁзҐбЄЁ ­ бв஥­­лҐ DNS-бҐаўҐал: 192.168.1.1
‘в вЁзҐбЄЁ ­ бв஥­­лҐ WINS-бҐаўҐал: ЋвбгвбвўгҐв
‡ ॣЁбваЁа®ў вм б бгд䨪ᮬ: ’®«мЄ® ®б­®ў­®©

Ќ бва®©Є Ё­вҐа䥩б "ЃҐбЇа®ў®¤­®Ґ бҐвҐў®Ґ ᮥ¤Ё­Ґ­ЁҐ"
DHCP а §аҐиҐ­: ЌҐв
IP- ¤аҐб: 192.168.1.250
Њ бЄ Ї®¤бҐвЁ: 255.255.255.0
Ћб­®ў­®© и«о§: 192.168.1.1
ЊҐваЁЄ и«о§ : 1
ЊҐваЁЄ Ё­вҐа䥩б : 0
‘в вЁзҐбЄЁ ­ бв஥­­лҐ DNS-бҐаўҐал: 192.168.1.1
8.8.8.8
‘в вЁзҐбЄЁ ­ бв஥­­лҐ WINS-бҐаўҐал: ЋвбгвбвўгҐв
‡ ॣЁбваЁа®ў вм б бгд䨪ᮬ: ’®«мЄ® ®б­®ў­®©

Ќ бва®©Є Ё­вҐа䥩б "VirtualBox Host-Only Network"
DHCP а §аҐиҐ­: ЌҐв
IP- ¤аҐб: 192.168.56.1
Њ бЄ Ї®¤бҐвЁ: 255.255.255.0
ЊҐваЁЄ Ё­вҐа䥩б : 0
‘в вЁзҐбЄЁ ­ бв஥­­лҐ DNS-бҐаўҐал: ЋвбгвбвўгҐв
‘в вЁзҐбЄЁ ­ бв஥­­лҐ WINS-бҐаўҐал: ЋвбгвбвўгҐв
‡ ॣЁбваЁа®ў вм б бгд䨪ᮬ: ’®«мЄ® ®б­®ў­®©
Настройка интерфейса "Подключение по локальной сети"
DHCP разрешен: Нет
IP-адрес: 192.168.1.251
Маска подсети: 255.255.255.0
Основной шлюз: 192.168.1.1
Метрика шлюза: 0
Метрика интерфейса: 0
Статически настроенные DNS-серверы: 192.168.1.1
Статически настроенные WINS-серверы: Отсутствует
Зарегистрировать с суффиксом: Только основной

Настройка интерфейса "Беспроводное сетевое соединение"
DHCP разрешен: Нет
IP-адрес: 192.168.1.250
Маска подсети: 255.255.255.0
Основной шлюз: 192.168.1.1
Метрика шлюза: 1
Метрика интерфейса: 0
Статически настроенные DNS-серверы: 192.168.1.1
8.8.8.8
Статически настроенные WINS-серверы: Отсутствует
Зарегистрировать с суффиксом: Только основной

Настройка интерфейса "VirtualBox Host-Only Network"
DHCP разрешен: Нет
IP-адрес: 192.168.56.1
Маска подсети: 255.255.255.0
Метрика интерфейса: 0
Статически настроенные DNS-серверы: Отсутствует
Статически настроенные WINS-серверы: Отсутствует
Зарегистрировать с суффиксом: Только основной


Добавлено:
Сообщение автоматически объединено:

Спрашивал знакомого как вообще такое сделать, он на VB6 написал меньше чем за полчаса, код маленький.
Ќ бва®©Є Ё­вҐа䥩б "Џ®¤Є«о祭ЁҐ Ї® «®Є «м­®© бҐвЁ"
DHCP а §аҐиҐ­: ЌҐв
IP- ¤аҐб: 192.168.1.251
Њ бЄ Ї®¤бҐвЁ: 255.255.255.0
Ћб­®ў­®© и«о§: 192.168.1.1
ЊҐваЁЄ и«о§ : 0
ЊҐваЁЄ Ё­вҐа䥩б : 0

Ќ бва®©Є Ё­вҐа䥩б "VirtualBox Host-Only Network"
DHCP а §аҐиҐ­: ЌҐв
IP- ¤аҐб: 192.168.56.1
Њ бЄ Ї®¤бҐвЁ: 255.255.255.0
ЊҐваЁЄ Ё­вҐа䥩б : 0

Ќ бва®©Є Ё­вҐа䥩б "ЃҐбЇа®ў®¤­®Ґ бҐвҐў®Ґ ᮥ¤Ё­Ґ­ЁҐ"
DHCP а §аҐиҐ­: ЌҐв
IP- ¤аҐб: 192.168.1.250
Њ бЄ Ї®¤бҐвЁ: 255.255.255.0
Ћб­®ў­®© и«о§: 192.168.1.1
ЊҐваЁЄ и«о§ : 1
ЊҐваЁЄ Ё­вҐа䥩б : 0
VERSION 5.00
Begin VB.Form frmMain
Appearance = 0 'Flat
BorderStyle = 1 'Fixed Single
ClientHeight = 5160
ClientLeft = 45
ClientTop = 315
ClientWidth = 7185
ClipControls = 0 'False
BeginProperty Font
Name = "Courier New"
Size = 12
Charset = 204
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
ForeColor = &H00000000&
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 344
ScaleMode = 3 'Pixel
ScaleWidth = 479
StartUpPosition = 2 'CenterScreen
End
Attribute VB_Name = "frmMain"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Dim nf As Long

Private Sub Corr(s As String)
Dim i As Long, v As Long

For i = 1 To Len(s)
v = Asc(Mid(s, i, 1))
Select Case v
Case 128 To 175
v = v + 64
Case 224 To 239
v = v + 16
End Select
Mid(s, i, 1) = Chr(v)
Next i
End Sub

Private Sub Test(s As String)
If InStr(1, s, "Настройка интерфейса") > 0 Then
s = Trim(Mid(s, 21))
ElseIf InStr(1, s, "IP-адрес:") > 0 Then
's = Trim(Mid(s, 21))
ElseIf InStr(1, s, "Основной шлюз:") > 0 Then
's = Trim(Mid(s, 21))
ElseIf InStr(1, s, "Маска подсети:") > 0 Then
's = Trim(Mid(s, 21))
Else
s = ""
End If
End Sub

Private Sub Form_Load()
Dim s As String

nf = FreeFile
Open "1.txt" For Input As #nf
While Not EOF(nf)
Line Input #nf, s
Corr s
Test s
If Len(s) > 0 Then Debug.Print s
Wend
Close #nf
End Sub
Type=Exe
Form=Fr.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\WINDOWS\system32\stdole2.tlb#OLE Automation
IconForm="frmMain"
Startup="frmMain"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="Microsoft"
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1

[MS Transaction Server]
AutoRefresh=1
frmMain = 44, 44, 675, 556, Z, 22, 22, 653, 534, C
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
sngr
Отлично! Теперь я знаю еще один метод работы с WMI.
Еще бы узнать как передать в getпараметр типа WHERE (NetConnectionID LIKE '%'), а пока используем для такого "отсева" ExecQuery
И как итог - скрипт без парсинга netsh как такового ;)
Код:
#NoTrayIcon
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=D:\Архив\ICONVISTA\ip.ico
#AutoIt3Wrapper_Res_Comment=Sergey
#AutoIt3Wrapper_Res_Description=Barbayanov
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=007
#AutoIt3Wrapper_Res_Language=1049
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#include <GuiIPAddress.au3>
#include <GuiComboBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Process.au3>
#include <Encoding.au3>

#region ### START Koda GUI section ### Form=смена ip.kxf
$Form1_1 = GUICreate("Change IP-address ", 207, 470, 444, 32)
$Combo1 = GUICtrlCreateCombo("", 8, 8, 185, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
$Combo2 = GUICtrlCreateCombo("", 8, 40, 185, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
GUICtrlSetState(-1, $GUI_DISABLE)
$Radio1 = GUICtrlCreateRadio("Получить IP и DNS сервера авто", 8, 98, 193, 17)
$Radio2 = GUICtrlCreateRadio("Использовать свои настройки", 8, 122, 185, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Radio3 = GUICtrlCreateRadio("Закладки", 8, 72, 177, 17)
$IPAddress1 = _GUICtrlIpAddress_Create($Form1_1, 42, 166, 113, 17)
$IPAddress2 = _GUICtrlIpAddress_Create($Form1_1, 42, 216, 113, 17)
$IPAddress3 = _GUICtrlIpAddress_Create($Form1_1, 42, 265, 113, 17)
$IPAddress4 = _GUICtrlIpAddress_Create($Form1_1, 42, 339, 113, 17)
$IPAddress5 = _GUICtrlIpAddress_Create($Form1_1, 42, 387, 113, 17)
$Group1 = GUICtrlCreateGroup("", 16, 136, 169, 162)
$Label1 = GUICtrlCreateLabel("IP адрес:", 26, 149, 50, 17)
$Label2 = GUICtrlCreateLabel("Маска подсети:", 26, 199, 84, 17)
$Label3 = GUICtrlCreateLabel("Основной шлюз:", 26, 248, 88, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlSetState(-1, $GUI_DISABLE)
$Group2 = GUICtrlCreateGroup("DNS сервера", 16, 301, 169, 113)
$Label4 = GUICtrlCreateLabel("Предпочитаемый DNS сервер", 26, 322, 157, 17)
$Label5 = GUICtrlCreateLabel("Альтернативный DNS сервер", 26, 370, 154, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button1 = GUICtrlCreateButton("Пуск", 32, 426, 137, 33)
#endregion ### END Koda GUI section ###

$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20

Dim $aAdapters[1][7] ; массив для хранения параметров сетевых адаптеров
$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20

$oWMI = ObjGet("winmgmts:\\.\root\CIMV2")
$oItems = $oWMI.ExecQuery("SELECT Index,NetConnectionID FROM Win32_NetworkAdapter WHERE (NetConnectionID LIKE '%')", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
For $oItem In $oItems ;перебор всех адаптеров
	$aAdapters[UBound($aAdapters) - 1][0] = $oItem.NetConnectionID
	$aAdapters[UBound($aAdapters) - 1][6] = $oItem.Index
	ReDim $aAdapters[UBound($aAdapters) + 1][7]
Next

For $i = 0 To UBound($aAdapters) - 2
	$oItems = $oWMI.Get("Win32_NetworkAdapterConfiguration.Index=" & $aAdapters[$i][6])
	$aAdapters[$i][1] = '0.0.0.0'
	$aAdapters[$i][2] = '0.0.0.0'
	$aAdapters[$i][3] = '0.0.0.0'
	$aAdapters[$i][4] = '0.0.0.0'
	$aAdapters[$i][5] = '0.0.0.0'
	If Not $oItems.DHCPEnabled Then
		For $oSubItem In $oItems.ipaddress
			$aAdapters[$i][1] = $oSubItem
		Next
		For $oSubItem In $oItems.IPSubnet
			$aAdapters[$i][2] = $oSubItem
		Next
		If IsArray($oItems.DefaultIPGateway) Then
			For $oSubItem In $oItems.DefaultIPGateway
				$aAdapters[$i][3] = $oSubItem
			Next
		EndIf
	EndIf
	If IsArray($oItems.DNSServerSearchOrder) Then
		$iDNS = 4
		For $oSubItem In $oItems.DNSServerSearchOrder
			$aAdapters[$i][$iDNS] = $oSubItem
			$iDNS += 1
			If $iDNS = 6 Then ExitLoop
		Next
	EndIf
Next

$sComboText = ''
For $i = 0 To UBound($aAdapters) - 2
    If $sComboText <> '' Then $sComboText &= '|'
    $sComboText &= $aAdapters[$i][0]
Next
GUICtrlSetData($Combo1, $sComboText, $aAdapters[0][0])
_fill_from_array($aAdapters[0][0])

$sPathINI = 'c:\config.ini'
$var = IniReadSectionNames($sPathINI)
$sComboText = ''
If IsArray($var) Then
    For $i = 1 To $var[0]
        If $sComboText <> '' Then $sComboText &= '|'
        $sAdName = IniRead($sPathINI, $var[$i], 'name', 'default')
        $sComboText &= $sAdName
        $aAdapters[UBound($aAdapters) - 1][0] = $sAdName
        $aAdapters[UBound($aAdapters) - 1][1] = IniRead($sPathINI, $var[$i], 'ip', '0.0.0.0')
        $aAdapters[UBound($aAdapters) - 1][2] = IniRead($sPathINI, $var[$i], 'mask', '0.0.0.0')
        $aAdapters[UBound($aAdapters) - 1][3] = IniRead($sPathINI, $var[$i], 'gateway', '0.0.0.0')
        $aAdapters[UBound($aAdapters) - 1][4] = IniRead($sPathINI, $var[$i], 'dns1', '0.0.0.0')
        $aAdapters[UBound($aAdapters) - 1][5] = IniRead($sPathINI, $var[$i], 'dns2', '0.0.0.0')
        ReDim $aAdapters[UBound($aAdapters) + 1][6]
    Next
    GUICtrlSetData($Combo2, $sComboText, IniRead($sPathINI, $var[1], 'name', 'default'))
Else
    GUICtrlSetData($Combo2, 'default', 'default')
    $aAdapters[UBound($aAdapters) - 1][0] = 'default'
    $aAdapters[UBound($aAdapters) - 1][1] = '0.0.0.0'
    $aAdapters[UBound($aAdapters) - 1][2] = '0.0.0.0'
    $aAdapters[UBound($aAdapters) - 1][3] = '0.0.0.0'
    $aAdapters[UBound($aAdapters) - 1][4] = '0.0.0.0'
    $aAdapters[UBound($aAdapters) - 1][5] = '0.0.0.0'
    ReDim $aAdapters[UBound($aAdapters) + 1][6]
EndIf

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg

        Case $Radio1
            WinSetState($IPAddress1, '', @SW_DISABLE)
            WinSetState($IPAddress2, '', @SW_DISABLE)
            WinSetState($IPAddress3, '', @SW_DISABLE)
            WinSetState($IPAddress4, '', @SW_DISABLE)
            WinSetState($IPAddress5, '', @SW_DISABLE)
            GUICtrlSetState($Combo2, $GUI_DISABLE)

        Case $Radio2
            WinSetState($IPAddress1, '', @SW_ENABLE)
            WinSetState($IPAddress2, '', @SW_ENABLE)
            WinSetState($IPAddress3, '', @SW_ENABLE)
            WinSetState($IPAddress4, '', @SW_ENABLE)
            WinSetState($IPAddress5, '', @SW_ENABLE)
            GUICtrlSetState($Combo2, $GUI_DISABLE)
            _ip_config_1()

        Case $Radio3
            _ip_config_1()
            GUICtrlSetState($Combo2, $GUI_ENABLE)
        Case $Combo2
            _ip_config_1()

        Case $Button1
            GUICtrlSetState($Button1, $GUI_DISABLE)
            $name_a = GUICtrlRead($Combo1)
            If GUICtrlRead($Radio2) = $GUI_CHECKED Then
                $name_a = GUICtrlRead($Combo1)
                $ip_a = _GUICtrlIpAddress_Get($IPAddress1)
                $mask_a = _GUICtrlIpAddress_Get($IPAddress2)
                $gatewey_a = _GUICtrlIpAddress_Get($IPAddress3)
                $dns_a = _GUICtrlIpAddress_Get($IPAddress4)
                $dns2_a = _GUICtrlIpAddress_Get($IPAddress5)

                $ip = "netsh interface ip set address name=""" & $name_a & """ source=static addr=" & $ip_a & " mask=" & $mask_a & " gateway=" & $gatewey_a & " gwmetric=1"
                $dns = "netsh interface ip set dns name=""" & $name_a & """ source=static addr=" & $dns_a
                $dns2 = "netsh interface ip add dns """ & $name_a & """ " & $dns2_a

                _RunDos($ip)
                _RunDos($dns)
                _RunDos($dns2)
            EndIf

            If GUICtrlRead($Radio1) = $GUI_CHECKED Then

                $ip = "netsh interface ip set address name=""" & $name_a & """ source=dhcp"
                $dns = "netsh interface ip set dns name=""" & $name_a & """ source=dhcp"
                _RunDos($ip)
                _RunDos($dns)
            EndIf

            If GUICtrlRead($Radio3) = $GUI_CHECKED Then
                $name_a = GUICtrlRead($Combo1)
                $name_c = GUICtrlRead($Combo2)
                $ip_a = _GUICtrlIpAddress_Get($IPAddress1)
                $mask_a = _GUICtrlIpAddress_Get($IPAddress2)
                $gatewey_a = _GUICtrlIpAddress_Get($IPAddress3)
                $dns_a = _GUICtrlIpAddress_Get($IPAddress4)
                $dns2_a = _GUICtrlIpAddress_Get($IPAddress5)
                $ip = "netsh interface ip set address name=""" & $name_a & """ source=static addr=" & $ip_a & " mask=" & $mask_a & " gateway=" & $gatewey_a & " gwmetric=1"
                $dns = "netsh interface ip set dns name=""" & $name_a & """ source=static addr=" & $dns_a
                $dns2 = "netsh interface ip add dns """ & $name_a & """ " & $dns2_a
                _RunDos($ip)
                _RunDos($dns)
                _RunDos($dns2)
            EndIf
            GUICtrlSetState($Button1, $GUI_ENABLE)

        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _ip_config_1()
    WinSetState($IPAddress1, '', @SW_ENABLE)
    WinSetState($IPAddress2, '', @SW_ENABLE)
    WinSetState($IPAddress3, '', @SW_ENABLE)
    WinSetState($IPAddress4, '', @SW_ENABLE)
    WinSetState($IPAddress5, '', @SW_ENABLE)
    If GUICtrlRead($Radio3) = $GUI_CHECKED Then
        $name_c = GUICtrlRead($Combo2)
    Else
        $name_c = GUICtrlRead($Combo1)
    EndIf
    _fill_from_array($name_c)
EndFunc   ;==>_ip_config_1

Func _fill_from_array($sSelectedText)
    For $i = 0 To UBound($aAdapters) - 2
        If $aAdapters[$i][0] = $sSelectedText Then
            _GUICtrlIpAddress_Set($IPAddress1, $aAdapters[$i][1])
            If $aAdapters[$i][1] = '0.0.0.0' Then WinSetState($IPAddress1, '', @SW_DISABLE)
            _GUICtrlIpAddress_Set($IPAddress2, $aAdapters[$i][2])
            If $aAdapters[$i][2] = '0.0.0.0' Then WinSetState($IPAddress2, '', @SW_DISABLE)
            _GUICtrlIpAddress_Set($IPAddress3, $aAdapters[$i][3])
            If $aAdapters[$i][3] = '0.0.0.0' Then WinSetState($IPAddress3, '', @SW_DISABLE)
            _GUICtrlIpAddress_Set($IPAddress4, $aAdapters[$i][4])
            If $aAdapters[$i][4] = '0.0.0.0' Then WinSetState($IPAddress4, '', @SW_DISABLE)
            _GUICtrlIpAddress_Set($IPAddress5, $aAdapters[$i][5])
            If $aAdapters[$i][5] = '0.0.0.0' Then WinSetState($IPAddress5, '', @SW_DISABLE)
            ExitLoop
        EndIf
    Next
EndFunc   ;==>_fill_from_array

k790 [?]
Спрашивал знакомого как вообще такое сделать, он на VB6 написал меньше чем за полчаса, код маленький.
Этот vbs зависит от локализации Windows, и в нем нет связки с DNS-настройками для каждого подключения.
 
Верх