我有一个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
,这非常令人困惑。
感谢。
答案 0 :(得分: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
答案 1 :(得分: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只是打印第5个令牌中有0
的行。
答案 2 :(得分:0)
您可以通过以下方式在DO内执行多个语句:
@FOR /L %%i in (1, 1, 5) DO @(
@echo %%i
@IF %%i==1 (@echo First)
@IF NOT %%i==1 (@echo Other)
)
其行中的每个命令按'()'分组。希望这会有所帮助...
答案 3 :(得分:0)
不是您问题的直接答案,而是实现目标的另一种方式(假设它是主机存在/可达的测试)将使用条件执行:
ping -n 1 -4 host1.internal >nul && echo "Host replied" || echo "Host not replied"
这使用命令返回的状态(在此实例中为ping)执行适当的命令 - &&
表示成功,||
表示失败。您也可以使用errorlevel测试,但我个人觉得条件更易读,特别是直接在命令行上。
额外的好处是它不依赖于语言(ping在Win中返回各种语言的本地化字符串)。
答案 4 :(得分:0)
这是检查ping成功或失败的另一种方法。
@echo off
ping -n 1 -4 host1.internal >nul && (echo ping succeeded) || (echo ping failed)