2013-04-23 4 views
0

У меня есть программа, в которой я беру список IP-адресов, запускаю на них nslookup и сохраняю их в двух разных файлах: в том числе IP-адрес, один из которых просто имеет выход nslookup. Чтобы сократить мои вызовы nslookup пополам, я хотел бы вызвать его один раз, сохранить его в переменной и затем записать в оба файла. Но простой магазин не работает.Сохранить возврат из команды в переменную в файле bat

set val=nslookup %ip% 

отображает

nslookup 127.0.0.1 

, а не результат работы его.

Я нашел один способ сделать это, это

nslookup %ip% | find "Name"> tempFile 
set /P result=<tempFile 

, но я сейчас пишу в файл, а затем получить значение обратно. Для этой стоимости я мог бы также дважды вызвать nslookup. Это также требует, чтобы я выбрал одну строку (это нормально для меня на этот раз, но для других случаев она может не работать).

Я также попытался использовать для цикла трюк

for /f "delims=" %%a in ('nslookup %ip% ^| find "Name"') do set name=%%a 

, но это возвращает только самую последнюю строку или одну строку я указать с находкой. Еще лучше, чем в предыдущем примере, поскольку нет временных файлов, но все же несовершенен.

Так что мой вопрос в том, есть ли лучший способ сохранить возвращаемое значение из команды в переменную.

Edit: Рассмотрим

nslookup 127.0.0.1 

который возвращает

Server: fake.com 
Address: 0.0.0.0 

Name: localhost 
Address: 127.0.0.1 

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

for /f "delims=" %%a in ('nslookup 127.0.0.1') do set returnVal=%%a 
echo %returnVal% 

для отображения

Server: fake.com 
Address: 0.0.0.0 

Name: localhost 
Address: 127.0.0.1 

, где сейчас отображается только

Address: 127.0.0.1 
+0

Учитывая выход две линий (по крайней мере), какую информацию вы пытаетесь извлечь? Пример будет хорошим. – Magoo

ответ

1

Пакетный файл ниже хранит четыре непустых l Инес, показанная NSLOOKUP в массиве с четырьмя элементов:

@echo off 
setlocal EnableDelayedExpansion 
set n=0 
for /f "delims=" %%a in ('nslookup 127.0.0.1') do (
    set /A n+=1 
    set returnVal[!n!]=%%a 
) 

rem To show all non-empty lines: 
for /L %%i in (1,1,%n%) do echo !returnVal[%%i]! 

rem Or: 
echo Line with Name: %returnVal[3]% 
+0

Кажется, мне нужно будет сохранить его в массиве. Благодарю. – Lawtonfogle

0

Try:

@echo off 
setlocal 
for /f "usebackq tokens=1,2 delims=:" %%a in (`nslookup %ip%`) do echo %%a:%%b 
+0

'for/f 'usebackq tokens = 1,2 delims =:" %% a in (' nslookup 127.0.0.1 ') do echo %% a: %% b' возвращает 'nslookup 127.0.0.1:'. Я делаю что-то неправильно? – Lawtonfogle

+0

Вы должны использовать обратные кавычки. Это то, что делает usebackq. Он разделяет ключ на kb. из командной строки cmd для чтения /? и он объясняет это на дно. –

+0

Echo производит правильный вывод, но когда я его храню, он сохраняет только последнюю строку. – Lawtonfogle

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