Unc*_*evo 4 for-loop cmd ping batch-file
我想创建一个.bat文件,它将执行for循环,如下所示:
@echo off
FOR /L %%G IN (1, 1, 69) DO (
ping -n 1 192.168.%%G.3
ping -n 1 192.168.%%G.4
)
Run Code Online (Sandbox Code Playgroud)
然后查看输出并仅将成功回复ping的IP发送到txt文件.这是否可以使用CMD批处理文件?
@ECHO OFF
SET output=%USERPROFILE%\output.txt
IF EXIST "%output%" DEL "%output%"
FOR /L %%G IN (1, 1, 69) DO (
CALL :ping 192.168.%%G.3
CALL :ping 192.168.%%G.4
)
GOTO :EOF
:ping
ping -n 1 %1 >NUL && ECHO %1>>"%output%"
Run Code Online (Sandbox Code Playgroud)
基本上,您使用&&添加命令仅在前一个命令(前一个命令&&)成功完成时执行(从技术上讲,返回退出代码0).
对于相反的情况,有一种类似的方法.如果要对命令的不成功结果执行某些操作,请将其放在||后面,然后执行操作的命令.
编辑
关于ping.有时您会从路由器收到主机无法访问的通知.在这种情况下,ping仍然会以0代码('成功')退出,因为它确实得到了答复,即使它来自路由器而不是来自实际主机.
如果您的主机可能出现这种情况,并且您不希望在输出文件中出现此类误报,则必须解析ping某些关键字的输出,以指示ping是否确实成功.到目前为止,您可以依赖显示聚合统计数据的行:它们仅在回复来自预期主机时出现.
所以,这是另一种方法:
@ECHO OFF
SET output=%USERPROFILE%\output.txt
IF EXIST "%output%" DEL "%output%"
FOR /L %%G IN (1, 1, 69) DO (
CALL :ping 192.168.%%G.3
CALL :ping 192.168.%%G.4
)
GOTO :EOF
:ping
ping -n 1 %1 | find "Approximate round trip" >NUL && ECHO %1>>"%output%"
Run Code Online (Sandbox Code Playgroud)
编辑2
更改了两个解决方案以使用子程序调用,以避免循环%ip%内部过早扩展for.(也可以通过启用延迟扩展来修复.)
也%output%随处引用.