0

我有一个 cmd.exe 脚本:

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

基本上,它将 ping 值返回给 host1.internal 而没有其他任何东西。我想添加 if else 语句,以便如果返回值为空格,则返回 0。

我试图这样做:... DO IF %i (@echo %i) IF NOT %i (@echo 0),但它会返回( was unexpected at this time,这很令人困惑。
谢谢。

4

5 回答 5

1

如果 FIND 失败,则回显一行,该行将解析为您想要的输出。

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

解释

FIND 如果找到字符串则返回成功 (ERRORLEVEL 0),如果找不到字符串则返回失败 (ERRORLEVEL 1)。

如果前面的&&命令成功,操作符有条件地执行命令,||如果前面的命令失败,则有条件地执行。||必须将其转义,原因^|^|与您的管道被转义的原因相同。ECHO 只是打印0在第 5 个标记中有 a 的行。

于 2013-05-17T10:30:37.830 回答
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
于 2013-05-17T07:33:26.527 回答
0

这是检查 ping 成功或失败的另一种方法。

@echo off
ping -n 1 -4 host1.internal >nul && (echo ping succeeded) || (echo ping failed) 
于 2013-05-17T08:37:01.997 回答
0

您可以通过这种方式在 DO 中执行多个语句:

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

其行中的每个命令都按“()”分组。希望这可以帮助...

于 2013-05-17T07:42:03.197 回答
0

不是对您的问题的直接回答,而是实现目标的另一种方法(假设它是测试主机是否存在/是否可访问)是使用条件执行:
ping -n 1 -4 host1.internal >nul && echo "Host replied" || echo "Host not replied"

这使用命令返回的状态(在本例中为 ping)来执行适当的命令 -&&表示成功和||失败。您也可以使用错误级别测试,但我个人发现条件更具可读性,尤其是直接在命令行上。

额外的优点是它不依赖于语言(ping 返回 Win 中各种语言的本地化字符串)。

于 2013-05-17T07:44:38.323 回答