2015-07-11 4 views
1

Что я пытаюсь сделать, это ускорить мои результаты чтения командного файла.Ускорение чтения результатов в пакетном скрипте

Я пытаюсь получить разные значения с помощью команд netsh, а затем представить их в консоли сценария, но это займет много времени. Ниже представлена ​​небольшая часть моего сценария, чтобы получить эту идею. (это всего лишь небольшая часть, я фактически получаю около 50 различных значений и использую больше команд netsh)

Кто-нибудь знает способ ускорить процесс?

. 
. 
. 
netsh interface ipv4 show config %AdapterLAN% >temp 
for /f "tokens=3" %%i in ('findstr "IP Address" temp') do set ip=%%i 
echo. IP Address  : %ip% 

for /f "tokens=5 delims=) " %%i in ('findstr "Subnet Prefix" temp') do set mask=%%i 
echo. Mask    : %mask% 

for /f "tokens=3" %%i in ('findstr "Gateway:" temp') do set gateway=%%i 
echo. Gateway   : %gateway% 

for /f "tokens=1,5,6" %%a in ('findstr "DNS" temp') do set dns1=%%a&set dns5=%%b&set dns6=%%c 
If "%dns1%"=="Statically" set dns=%dns5% 
if "%dns1%"=="DNS"  set dns=%dns6% 
echo. DNS Server  : %dns% 

for /f "tokens=3" %%i in ('findstr "Gateway Metric" temp') do set GMetric=%%i 
for /f "tokens=2" %%i in   ('findstr "InterfaceMetric" temp') do set IMetric=%%i 
set /a metricLAN=Gmetric + imetric 
echo. Metric   : %metricLAN% 

for /f "tokens=3" %%i in ('find "DHCP enabled" temp') do set LANDHCP=%%i 
If "%dns1%"=="Statically" set xx=Static 
if "%dns1%"=="DNS"   set xx=DHCP 
If /i %LANDHCP%==No  set LANDHCP=Static 
if /i %LANDHCP%==YES  set LANDHCP=DHCP 
echo. Obtained IP  : %LANDHCP% 
echo. Obtained DNS  : %xx% 
for /f "tokens=3 delims=," %%a in ('getmac /v /fo csv ^| find """%AdapterLAN-without-Q%""" ') do set macLAN=%%a 
echo. MAC-Addres  : %macLAN% 
del temp 
. 
. 
. 
netsh wlan show profile >temp 
. 
Do a similar process of getting values from another netsh command sent them 
in the temp file …echo the one I want on the screen ..delete the file etc. 
+0

Попробуйте выполнить каждый блок 'netsh' параллельно, используя' start/b '% ~ 0 "actionXX', добавьте' if not'% 1 "==" "goto% 1' в начале файла bat, добавьте' : action1 и т. д. для блоков. Чтобы сигнализировать о завершении каждого раздела, вы можете создать временный файл, который быстро сравнивается с 'netsh'. – wOxxOm

ответ

0

Следующий подход может быть немного быстрее (не временный файл (ы), обновленный нет множественного findstr):

@ECHO OFF >NUL 
SETLOCAL enableextensions enabledelayedexpansion 
set "AdapterLAN=wiredEthernet" 
set "IMetric=" 
set "GMetric=" 
for /F "tokens=1,2* delims=:" %%G in (' 
    netsh interface ipv4 show config "%AdapterLAN%"^|findstr /N /R "^" 
') do (
    rem echo G="%%G" H="%%H" I="%%I" 
    if "%%I"=="" (
     rem line 1 skip 
     rem line 2 = Configuration for interface 
     rem line 10 = DNS server #2 etc. 
    ) else (
     set "hh=%%H" 
     set "xx=!hh:IP Address=!" 
     if not "!hh!"=="!xx!" for /F "tokens=1*" %%i in ("%%I") do set "ip=%%i" 

     set "xx=!hh:Subnet Prefix=!" 
     if not "!hh!"=="!xx!" for /F "tokens=3 delims=) " %%i in ("%%I") do set "mask=%%i" 

     set "xx=!hh:Default Gateway=!" 
     if not "!hh!"=="!xx!" for /F "tokens=1*" %%i in ("%%I") do set "gateway=%%i" 

     set "xx=!hh:Gateway Metric=!" 
     if not "!hh!"=="!xx!" for /F "tokens=1*" %%i in ("%%I") do set "GMetric=%%i" 

     set "xx=!hh:InterfaceMetric=!" 
     if not "!hh!"=="!xx!" for /F "tokens=1*" %%i in ("%%I") do set "IMetric=%%i" 

    ) 
) 
echo( IP Address  : [%ip%] 
echo( Mask    : [%mask%] 
echo( Gateway   : [%gateway%] 
set /a metricLAN=Gmetric + IMetric 
echo( Metric   : [%metricLAN%] 
ENDLOCAL 
goto :eof 

Выход:

==>D:\bat\SO\31356115.bat 
    IP Address  : [192.168.1.100] 
    Mask    : [255.255.255.0] 
    Gateway   : [192.168.1.1] 
    Metric   : [20] 

==> 

Редактировать

Вот еще один подход: в отличие от netsh, синтаксический анализ командного выхода wmic, по-видимому, немного проще при использовании глагола get вместе с /value переключателем, поскольку он хорошо определен и хорошо структурирован. Вы можете найти здесь всю информацию, как из netsh: Следующий фрагмент кода должен читать и обнародует огромный спектр информации о все включено NIC адаптер (ы) в определенном локальном или удаленном компьютере:

@ECHO OFF >NUL 
SETLOCAL enableextensions enabledelayedexpansion 
set "NetCount=0" 
set "compName=%computername%" :: local or remote computer name 
set "compIDXs=" 
for /F "tokens=2 delims==" %%N in (' 
    wmic /node:"%compName%" NIC where "NetEnabled=TRUE" get InterfaceIndex /value 2^>NUL ^| find "=" 
') do for /F "tokens=*" %%n in ("%%N") do (
    for /F "tokens=*" %%G in (' 
    wmic /node:"%compName%" NIC where "InterfaceIndex=%%n" get /value 2^>NUL ^| find "=" 
    ') do for /F "tokens=*" %%g in ("%%G") do set "_%%n%%g" 
    for /F "tokens=*" %%I in (' 
    wmic /node:"%compName%" NICCONFIG where "InterfaceIndex=%%n" get /value 2^>NUL ^| find "=" 
    ') do for /F "tokens=*" %%i in ("%%I") do set "_%%n_%%i" 
    set /A "NetCount+=1" 
    set "compIDXs=!compIDXs! "%%n"" 
) 
set _ 
rem sample of it: 
echo compName=%compName% NetCount=%NetCount% compIDXs=%compIDXs% 
for %%x in (%compIDXs%) do (
    echo enabled InterfaceIndex=%%~x NetConnectionID=!_%%~xNetConnectionID! 
    for /F "tokens=1,2 delims={}," %%i in ("!_%%~x_IPAddress!") do echo ipv4=%%~i ipv6=%%~j 
) 

прочитанную Dave Benham's WMIC and FOR /F: A fix for the trailing <CR> problem, чтобы понять, почему любой вывод wmic обрабатывается через пару вложенных контуров for.

+0

Благодарим вас за предложение Josef. Я стараюсь в обоих направлениях, но они на самом деле намного медленнее, чем тот, который я сейчас использую сейчас. – Panikosagros