Xpoint
   [напомнить пароль]

Парсинг результата ipconfig /all

Метки: [без меток]
2011-02-07 18:03:58 [обр] tcolonel[досье]

Доброго здравия всем, существует ли возможность спарсить результат ipconfig /all в bat-файле? Допустим, мне нужно получить IP на определенном сетевом интерфейсе. Такое вообще возможно?

Как вариант, возможно еще использование WSH или VBS.

Спасибо.

спустя 37 минут [обр] Евгений Седов aka KPbIC(0/187)[досье]
М Перенесено из форума "Прочее"
спустя 10 часов [обр] Jared(0/26)[досье]
А почему бы и нет? С помощью того же WSH...
спустя 12 часов [обр] tcolonel[досье]
Jared[досье] Уважаемый, я телепатом никогда не был и навряд ли им стану. Собственно если бы знал как - не писал бы сюда ... Может "дадите поесть"?
спустя 2 часа 3 минуты [обр] Алексей Севрюков(9/1292)[досье]
tcolonel[досье] Perl на машине стоит?
спустя 53 минуты [обр] Jared(0/26)[досье]

tcolonel[досье] Вопрос был поставлен вполне точно, и я попытался максимально точно на него ответить. Ответ, разумеется, был бесполезен, как в том анекдоте =).

По теме. Естественно, спарсить вывод любой команды можно. Написав парсер на том или ином языке, достаточном для этого. "Язык" стандартных bat файлов AFAIK таких сложных манипуляций с данными не тянет. Можно поставить perl, python, php, bash + GNU utils, gcc/иной компилятор чтобы написать парсер на С или еще чем-то, java наконец. Можно реализовывать упомянутым WSH на JScript (MS реализация ECMAScript) или VBasic.

Вот наколеночная программка, как будто решающая вашу задачу (JScript):

// shell object
wshell = WScript.CreateObject('WScript.Shell');

// ipconfig command object stdout
var ipconfig = wshell.Exec('ipconfig /all').StdOut;

// getting output from ipconfig
var ipconfig_output_string = '';
while(!ipconfig.AtEndOfStream)
   ipconfig_output_string += ipconfig.Read(1);


// getting output as an array and defining output object
ipconfig_output_array = ipconfig_output_string.split(/\x0d\x0d\x0a/);
var interfaces = {};

// parsing
for(var i = 0; i<ipconfig_output_array.length; i++)
{
   // looking for header
   if(!ipconfig_output_array[i].match(/^\s{8}/) && ipconfig_output_array[i] != "\x0d") 
   {
      var name = ipconfig_output_array[i];
      var ip = null;

      // looking for IP                      
      for(i++; ipconfig_output_array[i].match(/^\s{8}/); i++)
      {
         if(
            ipconfig_output_array[i].match(/IP/) 
            && ipconfig_output_array[i].match(/((\d{1,3}\.){3}\d{1,3})/) 
         )
         {
            ip = RegExp.lastMatch;
            break;
         }
      }

      if(ip) interfaces[name] = ip;

      i--;
   }
}


// output
for(var i in interfaces)
{
   WScript.Echo(i+' => '+interfaces[i]);
}

С помощью WSH, возможно, такая задача должна бы решаться с использованием более... хм.. родных механизмов для системы (api?, реестр?).

спустя 23 минуты [обр] Jared(0/26)[досье]
Пардон, else сбежал...
      if(ip) interfaces[name] = ip;
      else i--;
спустя 3 часа 7 минут [обр] tcolonel[досье]

Алексей Севрюков[досье] Алексей, perl не стоит и не хотелось бы все так усложнять.
Jared[досье] Супер!!! Даже в голову такое не пришло... Спасибо. Обязательно посмотрю и разберу ...

Cуть задачи заключается в том, чтобы найти определенное подключение и спарсить в этом подключении последние 8 бит в IP.

На анный момент я вот что нашел:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkAdapter")
For Each objItem in colItems
    MsgBox(objItem.Description)
Next

а вот дальше пока зашел в тупик ... Но, что-то мне подсказывает, что я на верном пути ... Осталось только раскопать свойства и методы objItem. Может кто-то сталкивался?

Всем спасибо за участие.

спустя 2 часа 4 минуты [обр] tcolonel[досье]
Видимо все-таки не там копнул ... Нашел все свойства класса Win32_NetworkAdapter, перебрал их все и что-то IP там не пахнет ((( У кого-нибудь есть еще идеи?
class Win32_NetworkAdapter : CIM_NetworkAdapter
{
  string   AdapterType;
  uint16   AdapterTypeID;
  boolean  AutoSense;
  uint16   Availability;
  string   Caption;
  uint32   ConfigManagerErrorCode;
  boolean  ConfigManagerUserConfig;
  string   CreationClassName;
  string   Description;
  string   DeviceID;
  boolean  ErrorCleared;
  string   ErrorDescription;
  string   GUID;
  uint32   Index;
  datetime InstallDate;
  boolean  Installed;
  uint32   InterfaceIndex;
  uint32   LastErrorCode;
  string   MACAddress;
  string   Manufacturer;
  uint32   MaxNumberControlled;
  uint64   MaxSpeed;
  string   Name;
  string   NetConnectionID;
  uint16   NetConnectionStatus;
  boolean  NetEnabled;
  string   NetworkAddresses[];
  string   PermanentAddress;
  boolean  PhysicalAdapter;
  string   PNPDeviceID;
  uint16   PowerManagementCapabilities[];
  boolean  PowerManagementSupported;
  string   ProductName;
  string   ServiceName;
  uint64   Speed;
  string   Status;
  uint16   StatusInfo;
  string   SystemCreationClassName;
  string   SystemName;
  datetime TimeOfLastReset;
};
спустя 27 минут [обр] tcolonel[досье]

Все-таки решил воспользоваться решением уважаемого Jared[досье] за что Вам огромное спасибо.

Вот что в итоге получилось:

// shell object
wshell = WScript.CreateObject('WScript.Shell');
// ipconfig command object stdout
var ipconfig = wshell.Exec('ipconfig /all').StdOut;
// getting output from ipconfig
var ipconfig_output_string = '';
while(!ipconfig.AtEndOfStream) ipconfig_output_string += ipconfig.Read(1);
// getting output as an array and defining output object
ipconfig_output_array = ipconfig_output_string.split(/\x0d\x0d\x0a/);
// parsing
for(var i = 0; i < ipconfig_output_array.length; i++)
{
    // looking for header
    if(!ipconfig_output_array[i].match(/^\s{8}/) && ipconfig_output_array[i] != "\x0d") 
    {
        var name = ipconfig_output_array[i];
        if(name.match(/sim/))
        {
            var ip = null;
            var last_digit = null;
            // looking for IP                      
            for(i++; ipconfig_output_array[i].match(/^\s{8}/); i++)
            {
                if(ipconfig_output_array[i].match(/IP/) && ipconfig_output_array[i].match(/((\d{1,3}\.){3}\d{1,3})/))
                {
                    ip = RegExp.lastMatch;
                    last_digit = ip.substring(ip.lastIndexOf(".")+1);
                    break;
                }
            }
            break;
        }
    }
}

wshell.Exec('route add xx.xx.xx.xx mask 255.255.255.255 xx.xx.xx.' + last_digit);

не самое лучшее решение, но, зато рабочее.

Буду рад другим идеям и предложениям.

Спасибо всем за участие.

спустя 7 часов [обр] ddd(1/36)[досье]

А если айпи несколько?

Powershell гораздо проще. Получение адреса: (gwmi Win32_NetworkAdapterConfiguration | ? { $_.IPAddress -ne $null }).ipaddress - массив айпи адресов.

спустя 10 минут [обр] Jared(0/26)[досье]

ddd[досье] А Powershell стоит на всех версиях используемых нынче виндов, включая XP?

tcolonel[досье] Win32_NetworkAdapter, судя по всему - железка. Данные по настройкам IP протокола на этой железке все таки другой уровень абстракции. ddd[досье] подсказывает имя нужного класса =)

спустя 1 час 22 минуты [обр] ddd(1/36)[досье]

Jared[досье]

Ну автор же не указал в какой среде будет использоваться скрипт. vbs производительнее и универсальные, это есть, но на пш пишется в разы быстрее и возможностей больше.
Каждый для себя сам решает, что использовать. Лично я сделал выбор в пользу пш, более удобного скриптового языка я еще не видел.

спустя 1 час 42 минуты [обр] tcolonel[досье]

ddd[досье] Ну, думаю, не составит труда получить необходимый IP из массива ) А вот за класс - спасибо. Уж очень в MSDN навигация хромает ... Насчет Powershell могу сказать одно - никогда не работал с ним, поэтому видимо выбор пал в сторону VBS. Не подскажите источники для ликбеза?

Jared[досье] У меня Powershell не стоит (WinXP SP3). Да-да, Вы правы, но не совсем - класс Win32_NetworkAdapter для работы с сетевыми интерфейсами (помимо железок он еще и видит виртуальные). Ну а ddd[досье] действительно подсказал то, что нужно. Вечером буду пробовать. Потом отпишусь.

Всем спасибо.

спустя 1 год 5 месяцев [обр] nikita90+[досье]
Конечно можно, с помощью того же WSH. Как вариант можно погуглить, сейчас полно информации. Если не получится, то в личку!
Powered by POEM™ Engine Copyright © 2002-2005