2014-01-20 40 views
0

我试图获取所有可用无线网络的MAC地址。正则表达式从netsh获得MAC地址wlan

目前正在使用: netsh wlan show networks mode=bssid | findstr BSSID

输出我得到它(真正的MAC隐藏的隐私):

BSSID 1     : 2c:ab:25:xx:xx:xx 
BSSID 1     : 00:22:2d:xx:xx:xx 
BSSID 1     : c4:3d:c7:xx:xx:xx 
BSSID 1     : 00:27:22:xx:xx:xx 
BSSID 1     : 84:c9:b2:xx:xx:xx 
BSSID 1     : 00:25:5e:xx:xx:xx 
BSSID 1     : 00:06:5a:xx:xx:xx 
BSSID 2     : 00:06:5a:xx:xx:xx 
BSSID 1     : 00:06:5a:xx:xx:xx 
BSSID 2     : 00:06:5a:xx:xx:xx 
BSSID 1     : 00:06:5a:xx:xx:xx 
BSSID 2     : 00:06:5a:xx:xx:xx 
BSSID 1     : 00:06:5a:xx:xx:xx 
BSSID 2     : 00:06:5a:xx:xx:xx 
BSSID 3     : 00:25:5e:xx:xx:xx 
BSSID 4     : 00:25:5e:xx:xx:xx 
BSSID 5     : 00:25:5e:xx:xx:xx 
BSSID 1     : 00:27:22:xx:xx:xx 
BSSID 1     : 00:27:22:xx:xx:xx 
BSSID 1     : fc:b0:c4:xx:xx:xx 
BSSID 1     : fc:b0:c4:xx:xx:xx 

我需要实现一个正则表达式可输出只有MAC地址(即每行最后17个字符) 需要将MAC地址存储在C++数组中。
 
我当前的代码是像这样来输出:

#include <iostream> 
#include <string> 
#include <stdio.h> // for _popen() and _pclose() 
using namespace std; 

    int main() 
    { 
     char buff[512]; 
     buff[0]=0; 
     string cmd="netsh wlan show networks mode=bssid | findstr BSSID"; 
     FILE *fpipe = _popen(cmd.c_str(),"rt"); 

     if(fpipe==NULL) 
      cout<<"Failed to open"<<endl; 
     else 
      cout<<"Opened pipe successfully"; 
     while(fgets(buff,sizeof(buff),fpipe)!=NULL){ 
      cout<<buff<<endl; 
     } 

     _pclose(fpipe); 
    } 

有人可以提供我要实现升压正则表达式中数组只得到MAC地址的代码片段? 我的意图是将这些MAC地址传递给Google地理位置API并获取位置信息。

任何想法?

谢谢!

回答

0

我终于设法让它工作。 这里是我使用的代码片段:

#include <iostream> 
#include <string> 
#include <stdio.h> // for _popen() and _pclose() 
#include <regex> 
#include <iterator> 

using namespace std; 

int main() 
{ 
    char buff[512]; 
    buff[0]=0; 
    string MacOutput; 

    string cmd="netsh wlan show networks mode=bssid | findstr BSSID"; 
    FILE *fpipe = _popen(cmd.c_str(),"rt"); 

    if(fpipe==NULL) 
     cout<<"Failed to open"<<endl; 

    while(fgets(buff,sizeof(buff),fpipe)!=NULL){ 
     string temp = string(buff); 
     MacOutput.append(temp); 
    } 
    _pclose(fpipe); 

    regex mac_regex("([0-9a-f]{2}[:-]){5}[0-9a-f]{2}"); 

    auto words_begin = 
     sregex_iterator(MacOutput.begin(), MacOutput.end(), mac_regex); 
    auto words_end = sregex_iterator(); 
    int j=0; 
    for (sregex_iterator i = words_begin; i != words_end; ++i) { 
     smatch match = *i;             
     string match_str = match.str(); //Can store the outputs in an array here! 
     cout << match_str << '\n'; 
    } 
} 

感谢所有那些谁帮助! &那些我从整个stackoverflow使用的片段!

0

你可以“分裂”使用这种在卡拉科特:字符串(假设您可以将命令的输出保存到文件C:\ TEMP \ mac.txt)

for /f "tokens=2,* delims=:" %%i in (c:\temp\mac.txt) do echo %%i:%%j 

或者你可以(我不能测试这个)

for /f "tokens=2,* delims=:" %%i in ('netsh wlan show networks mode=bssid ^| findstr BSSID') do echo %%i:%%j 
+0

谢谢......但我无法在我的代码中使用一个文件。我正在使用CPP。直接使用netsh不起作用... – Tzar

+0

你不能在C++中使用正则表达式?你为什么要分批解析? –

+0

我还是CPP的新手。我试图创建一个这些MAC地址的数组,这些地址将被传递给Google地理定位API。你可以帮忙用这个cpp代码片段吗? – Tzar

1

哦 - Kayasax是如此接近!问题是,输出具有领先的空间....

FOR /f "tokens=1*delims=:" %%a IN (c:\temp\mac.txt) DO (
FOR /f "tokens=*" %%c IN ("%%b") DO ECHO %%c) 

应该删除该空间。

替代的方式Kayasax建议应与本也行的文件名netsh命令

FOR /f "tokens=1*delims=:" %%a IN (
'netsh wlan show networks mode=bssid ^| findstr BSSID') DO (
FOR /f "tokens=*" %%c IN ("%%b") DO ECHO %%c) 

你知道 - 在netsh ......吩咐Kayasax主张。

+0

谢谢@Magoo ..这工作。但是这里的问题是我试图用C++来实现它。无法使用文件。还有其他建议吗?用netsh代替文件名不起作用。 – Tzar