2013-05-17 3 views
0

У меня есть cmd.exe сценарий:Добавить, если заявление cmd.exe сценарий

FOR /F "tokens=5 delims==<ms" %i IN ('ping -n 1 -4 host1.internal ^|find "Reply from"') DO @echo %i 

В основном, она возвращает значение звона в host1.internal без чего-либо еще. Я хочу добавить инструкцию if else, чтобы возвращаемое значение было пустым пространством, затем верните 0.

Я попытался сделать это вот так: ... DO IF %i (@echo %i) IF NOT %i (@echo 0), но он возвращает (was unexpected at this time, и это довольно запутанно.
Спасибо.

+0

Прошу прощения, но все 4 ответа, которые в настоящее время опубликованы, на самом деле не помогают. Мне нужен точный ответ, который получает скрипт, и если ping не был успешным, тогда верните 0. В качестве примера выполните pinging google. com, он должен вернуть «10» (как в 10 мс) и выполнить pinging notexistinghost.com, он должен вернуть «0». –

+0

В этом случае, я думаю, ваша проблема в том, что если нет совпадений, ничего не выполняется. Вам придется думать, что ваш код по-другому. Я смутился тем решением, которое вы попробовали. –

ответ

1

Если FIND терпит неудачу, то выделите строку, которая будет анализировать ваш желаемый результат.

FOR /F "tokens=5 delims==<ms" %i IN ('ping -n 1 -4 host1.internal ^|find "Reply from"^|^|echo XmXmXmXm0') DO @echo %i 

Объяснение

, что доходность с успехом (ERRORLEVEL 0), если строка найдена, отказ (ERRORLEVEL 1), если строка не найдена.

Оператор && условно выполняет команду, если предыдущая команда выполнена успешно, а || условно выполняется, если предыдущая команда не выполнена. || должен быть экранирован как ^|^| по той же причине, что и ваш канал. ECHO просто печатает строку, которая имеет 0 в 5-м токене.

+0

Ничего себе, спасибо, только то, что я хотел, и выглядит очень круто. Принимая в качестве наилучшего ответа, но не могли бы вы уделить время/объяснить, как это происходит на самом деле? ('^ |^|' часть и 'XmXmXmXm0' часть) –

+1

@the_lay - информация добавлена. – dbenham

1

Попробуйте это:

@echo off&setlocal 
FOR /F "tokens=5 delims==<ms" %%i IN ('ping -n 1 -4 host1.internal ^|find "Reply from"') DO set "replay=%%i" 
if defined replay (echo(%replay%) else echo(0 

.. тот же код в командной строке:

FOR /F "tokens=5 delims==<ms" %i IN ('ping -n 1 -4 host1.internal ^|find "Reply from"') DO if "%i" equ "" (echo(0) else echo(%i 
+0

Ницца!Есть ли способ сделать его «однострочным»? Я не хочу делать это как .bat-файл, я хочу, чтобы он был запущен в cmd.exe точно так же. –

+0

@the_lay - Я сделал редактирование, но не могу проверить это. У моего 'ping' есть другой выход. – Endoro

+1

Последнее редактирование не может работать, потому что не будет итерации, если FIND завершится с ошибкой. См. [Мой ответ] (http://stackoverflow.com/a/16606860/1012053) для одного лайнера, который работает. – dbenham

0

Вы можете выполнить несколько операторов внутри DO так:

@FOR /L %%i in (1, 1, 5) DO @(
@echo %%i 
@IF %%i==1 (@echo First) 
@IF NOT %%i==1 (@echo Other) 
) 

Каждая команда его строка сгруппирована по '()'. Надеюсь, что это помогает ...

0

Не является прямым ответом на ваш вопрос, но другой способ достижения своей цели (при условии, что это испытание, если хозяин существует/достижим) будет использовать условное исполнение:
ping -n 1 -4 host1.internal >nul && echo "Host replied" || echo "Host not replied"

Это использует статус, возвращенный командой (ping в этом случае) для выполнения соответствующей команды - && означает успех и || при сбое. Вы также можете использовать тесты ошибок, но я лично считаю, что условия более читабельны, особенно непосредственно в командной строке.

Дополнительный плюс - это не зависит от языка (ping возвращает локализованные строки для разных языков в Win).

+0

Мне нужен результат в цифрах, а не только результат «ОК» или «Сбой». Спасибо, в любом случае! –

0

Вот еще один способ проверить успех или неудачу пинга.

@echo off 
ping -n 1 -4 host1.internal >nul && (echo ping succeeded) || (echo ping failed) 
+0

Это был мой любимый тоже :), но OP хочет эха IP ... – Endoro

+0

Мне нужен результат в цифрах, а не только «ОК» или «Сбой». Спасибо, в любом случае! –

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