2015-01-26 2 views
0

Я работаю над пакетным скриптом, который будет запрашивать некоторые реестры на других компьютерах Windows. Он собирается перебирать все живые IP-адреса, и это тоже после проверки, если я получаю TTL от 120 до 128. Еще одно требование - сначала проверить, успешно ли первый запрос реестра на каждой машине. Например, он начнется с 192.168.1.1, пинг его один раз. Получите значение TTL. Если TTL колеблется от 120 до 128, то это система окон. Теперь запросите первый реестр. Если запрос был успешным, повторите запрос еще на 6 реестров и продолжайте записывать результаты в файл txt. пинг часть я был в состоянии получить с помощью следующих действий:Вложенный пакетный скрипт с циклами for, if и reg

for /l %%a in (1,1,254) do for /f "tokens=8 delims=^= " %%b in ('ping -n 1 192.168.1.%%a ^| find /I "TTL"') do echo 192.168.1.%%a -- Online , TTL: %%b 

Теперь мне нужно добавить условие IF к нему. Но он не показывает никакого вывода:

for /l %%a in (1,1,254) do for /f "tokens=8 delims=^= " %%b in ('ping -n 1 192.168.1.%%a ^| find /I "TTL"') do if %%b==128 echo 192.168.1.%%a -- Online , TTL: %%b 

Далее мне нужно запросить следующий раздел реестра:

reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName /v computername 2>null >> query_result.txt 

Если это успех, остальные запросы из реестров. И этот процесс необходимо повторить для всех 254 IP-адресов. В простой и медленный рабочий, как я это сделал followingly (к примеру):

for /l %%i in (1,1,254) do (reg query \\192.168.1.%%i\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName /v computername >> result.txt & reg query \\192.168.1.%%i\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion /v productname 2>null >> result.txt) 

Хотя выше код работает, но очень медленно, becoz он пытается запросить реестр на мертвых IP-адреса также. Я выполнял три метода отдельно, используя 3 файла результата. Я хочу их сгруппировать. Как я могу добавить все вместе? Plz разъясняет применение условных выражений IF, о том, как их использовать. Я пробовал в течение 2 дней, но не добился успеха.

Благодаря marc_kriss

ответ

1
for /l %%a in (1,1,254) do for /f "tokens=8 delims=^= " %%b in ('ping -n 1 192.168.1.%%a ^| find /I "TTL"') do if %%b==128 echo 192.168.1.%%a -- Online , TTL: %%b 

Закрыть, но он будет выводиться только если %%b ровно 128. Если вы хотите в диапазоне 120 to 128%%b, то вам нужно

... do if %%b leq 128 if %%b geq 120 echo ... 

где leq означает меньше или равно. Я дам вам угадать, что geq значит ...

Вместо echo здесь, вы могли бы естественно использовать

... geq 120 (
    echo processing 192.168.1.%%a onine TTL %%b 
req query...192.168.1.%%a ... 
) 

для выполнения запроса рег с использованием выбранных на линии машины-адреса.


Ответ на комментарий:

На моей машине, я нашел

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 
Reply from 192.168.0.1: bytes=32 time=1ms TTL=64 

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

Теперь в первый результат, 128 выглядит как %% b`

Во втором TTL появляется, так как есть =, как time, не <. Таким образом, маркеры должны быть 9 не 8.

Или вы могли бы присвоить всю строку в переменной окружения yourstring в режиме delayedexpansion, а затем использовать

set "yourstring=!yourstring:*TTL=!" 
set "yourstring=!yourstring:~1!" 

Тогда вам нужно сравнить !yourstring! с 120,128 вместо от %%b.


Редакция

@ECHO OFF 
Setlocal EnableDelayedExpansion 
for %%a in (192.168.0.1 192.168.0.2 192.168.0.3 127.0.0.1) do for /f "delims=" %%b in ('ping -n 1 %%a ^| find /I "TTL"') do (
ECHO TTL line found FOR %%a is %%b 
set "yourstring=%%b" 
set "yourstring=!yourstring:*TTL=!" 
set "yourstring=!yourstring:~1!" 
ECHO yourstring is "!yourstring!" 
if !yourstring! leq 128 if !yourstring! GEQ 65 (
    echo %%a online , TTL: !yourstring! 
    ECHO now DO whatever with "%%a" or "!yourstring!" 
    reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName /v computername 2>nul 
) 
ECHO end report FOR %%a =============================== 
) 
GOTO :EOF 

Результаты на моей машине:

TTL line found FOR 192.168.0.1 is Reply from 192.168.0.1: bytes=32 time<1ms TTL=64 
yourstring is "64" 
end report FOR 192.168.0.1 =============================== 
TTL line found FOR 192.168.0.2 is Reply from 192.168.0.2: bytes=32 time<1ms TTL=128 
yourstring is "128" 
192.168.0.2 online , TTL: 128 
now DO whatever with "192.168.0.2" or "128" 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName 
    computername REG_SZ OWEN-PC 

end report FOR 192.168.0.2 =============================== 
TTL line found FOR 127.0.0.1 is Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 
yourstring is "128" 
127.0.0.1 online , TTL: 128 
now DO whatever with "127.0.0.1" or "128" 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName 
    computername REG_SZ OWEN-PC 

end report FOR 127.0.0.1 =============================== 

Примечание: ошибка в выборе строки после TTL скорректированного - шальная ~ прокралась в (исправленном)

Я использовал набор адресов - вы, очевидно, y знает, как вернуть это значение for /l %%a ... и как построить 192.168.1.%%a по мере необходимости.

Я не могу проверить, что вы хотите извлечь из активных компьютеров (имя компьютера?), Так как у меня нет других активных машин. Я только что использовал то, что вернулся с TTL-ответом.

Примечание nul не null Использование последнего создаст файл с именем null.

Отметьте, что for /l принимает 3 параметра - в вашем комментарии 4.

Каретка не требуется (но безвредный) в "delims== " символы между первой = и " являются разделителями - но пространство должно быть последним (на будущее) - "delims=" выключает все разделители как разделитель-отсчет не является надежным в этом приложении.

Обратите внимание, что я удалил перенаправление до query_result.txt, чтобы показать результаты на экране.

+0

Спасибо ... Но я не получаю выходное состояние IF. Я пробовал все возможные комбинации (здесь в лаборатории TTL только 128). Условие выполнено. Если я напечатаю переменную %% без IF, это произойдет, но после вывода IF это не будет. В противном случае я бы не отправил вопрос. – kriss

+0

Да, сэр, вы правы. Хотя токены = 8 распознают TTL как 64 и 128, но он не делает этого в случае применения «IF» к команде. Я понял. Большое спасибо. Но не могли бы вы рассказать об использовании SET, который вы использовали. Это похоже на регулярные выражения (как в Linux), но я еще не узнал об этом. Попросите вас объяснить это. Также plz дает пример вложенных циклов FOR и IF. Пример 3 или 4 уровня вложенных циклов. U, возможно, обнаружил необходимость в нем с моего поста. Также использование брекетов '(' ')'. Буду признателен. – kriss

+0

Это все еще не полностью работает для меня. Если я добавлю GEQ вместе с LEQ, он ничего не отобразит: @echo off Setlocal EnableDelayedExpansion set "yourstring =! Yourstring: ~ * TTL =!" set "yourstring =!yourstring: ~ 1! " для/l %% a in (1 7 8 100) do for/f" tokens = 9 delims =^= "%% b in ('ping -n 1 192.168.1. %% a^| find/I "TTL" ') do if %% b leq 128 if %% b GEQ 65 (echo 192.168.1. %% a online, TTL: %% b) – kriss

Смежные вопросы