For loop CMD关闭而不是循环

For loop CMD关闭而不是循环,for-loop,batch-file,cmd,For Loop,Batch File,Cmd,我正在编写一个简单的脚本,在出现故障时记录一些时间和ping信息,但是ping到位后,脚本就会关闭 :: setting variables/conditions for the loop :: not interval is number of seconds between loop run set folder1="C:\Users\Joseph\Desktop\Testing_1" set num=0 Set Interval=60

我正在编写一个简单的脚本,在出现故障时记录一些时间和ping信息,但是ping到位后,脚本就会关闭

:: setting variables/conditions for the loop
:: not interval is number of seconds between loop run

    set folder1="C:\Users\Joseph\Desktop\Testing_1"
    set num=0
    Set Interval=60 
    set IPAddress=8.8.8.8

:LoopStart
    
    ping -n 4 %IPADDRESS% | find "TTL=" > nul
        if errorlevel 1 set /a num=%num% + 1
        if errorlevel 1 set file1="%folder1%\25090_log_%num%.txt"
        if errorlevel 1 echo %date%-%time% >> %file1%
        if errorlevel 1 ping -n 1 %ipaddress% >>%file1%
    timeout %INTERVAL%
Goto LoopStart

关于如何在ping通过时使其不关闭,有什么想法吗?我有点困惑,当ping失败时,一切都可以正常工作-按需要循环和记录。

我不确定您的问题是什么,但看看您提供的脚本,我认为这样会更清楚:

@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion
Rem设置循环的变量/条件
Rem note interval是循环运行之间的秒数
设置“folder1=%USERPROFILE%\Desktop\Testing\u 1”
设置“IPAddress=8.8.8.8”
设置“间隔=60”
设置“num=0”
:LoopStart
“%\uuuu APPDIR\uuuuu%PING.EXE”-n 4%IPAddress%^
|“%_uappdir_%find.exe”“TTL=“| |”(Set/A num+=1
SetLocal EnableDelayedExpansion
1> “%folder1%\25090\u log!num!.txt”(回显%DATE%-%TIME%
“%\uuuu APPDIR\uuuuu%PING.EXE”-n 1%IPAddress%)
(本地)
“%\uuuu APPDIR\uuuu%timeout.exe”/T%Interval%/NoBreak
转到循环开始
如果您不满意使用有条件的
|
,您仍然可以使用
If ErrorLevel

@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion
Rem设置循环的变量/条件
Rem note interval是循环运行之间的秒数
设置“folder1=%USERPROFILE%\Desktop\Testing\u 1”
设置“IPAddress=8.8.8.8”
设置“间隔=60”
设置“num=0”
:LoopStart
“%\uuuu APPDIR\uuuuu%PING.EXE”-n 4%IPAddress%^
|“%\uuuu APPDIR\uuuuu%find.exe”“TTL=”
如果错误级别1(设置/A num+=1
SetLocal EnableDelayedExpansion
1> “%folder1%\25090\u log!num!.txt”(回显%DATE%-%TIME%
“%\uuuu APPDIR\uuuuu%PING.EXE”-n 1%IPAddress%)
(本地)
“%\uuuu APPDIR\uuuu%timeout.exe”/T%Interval%/NoBreak
转到循环开始
然而,如果是延迟扩张令你胆战心惊,那么这更像是我从外交部的建议中所期望的

@Echo关闭
setLocalEnableExtensions
Rem设置循环的变量/条件
Rem note interval是循环运行之间的秒数
设置“folder1=%USERPROFILE%\Desktop\Testing\u 1”
设置“IPAddress=8.8.8.8”
设置“间隔=60”
设置“num=0”
:LoopStart
“%\uuuu APPDIR\uuuuu%PING.EXE”-n 4%IPAddress%^
|“%\uuuu APPDIR\uuuuu%find.exe”“TTL=”
如果不是错误级别1转到进程等待
Set/A num+=1
1> “%folder1%\25090\u log\uUnum%.txt”(回显%DATE%-%TIME%
“%\uuuu APPDIR\uuuuu%PING.EXE”-n 1%IPAddress%)
:ProcessWait
“%\uuuu APPDIR\uuuu%timeout.exe”/T%Interval%/NoBreak
转到循环开始

更正并测试感谢@mofi对建议的评论非常有效

移植一个涉及较少代码的选项并使用
|
运算符将是:

@echo关闭
setLocal EnableDelayedExpansion
设置“\u IP=8.8.8.8”&设置/a“\u Int=5,\u Num=0”
设置“\u文件夹=%UserProfile%\Desktop\Testing\u 1”
:LoopStart
%__APPDIR\uu%\ping.exe-n 4_IP|查找“TTL=“>nul&&goto=:ProcessWait||(
设置/a“\u Num+=1”&调用设置“\u File=!\u文件夹!\25090\u!\u Num!.txt”
>>“!\u文件!”(echo;!date!-!time!&%\uuuuuu APPDIR\uuuuu%\ping.exe-n1!\uip!))
:ProcessWait
%__APPDIR_u%timeout.exe/nobreak_Int!&goto=:LoopStart
我建议使用
返回0/返回非0
而不是
错误级别1
,执行成功或不成功

&&
|
运算符执行的操作

成功或不成功执行后将发生的动作由操作员承担,操作员处理的可靠性不容置疑

返回0
返回非0
是操作员使用
&
|
执行的操作


注意:我不是说/确认
errorlevel
的可靠性更低或更高。
@echo关闭
setLocal EnableDelayedExpansion
设置“\u IP=8.8.8.8”&设置/a“\u Int=5”
设置“\u文件夹=%UserProfile%\Desktop\Testing\u 1”
:LoopStart
%__APPDIR\uu%\ping.exe-n 4_IP|查找“TTL=“>nul&&goto=:ProcessWait||(
设置/a“\u Num+=1+0”&调用设置“\u File=!\u文件夹!\25090\u Num!.txt”
>>“!\u文件!”(echo;!date!-!time!&%\uuuuuu APPDIR\uuuuu%\ping.exe-n1!\uip!))
:ProcessWait
%__APPDIR_u%timeout.exe/nobreak_Int!&goto=:LoopStart

  • 如果在进入循环之前需要声明
    \u num
    ,可以在一行中声明/设置多个数值变量:

set/a“var1=x,var2=y,varN=n”
如果您希望在
set
中使用引号,则开头的引号放在变量名称之前,如下所示:
set“folder1=C:\Users\Joseph\Desktop\Testing\u 1”
。因此,它应该是
设置“file1=%folder1%\25…”,而不是
设置file1=“…”
,请参见,环境变量
file1
是用
“C:\Users\Joseph\Desktop\Testing\u 1”\25090\u log\u 1.txt”定义的。你看到引号有什么不对吗?同时在命令提示符窗口中运行
set/?
,并在输出帮助中阅读有关算术表达式的部分。最好使用
set/a num+=1
而不是
set/a num=%num%+1
。这样我的输出可以按需要运行,并且当出现错误时,脚本可以正常运行。我更想知道,当CMD没有错误时,为什么CMD会关闭,而不是像预期的那样连续循环-例如,为什么只有在出现错误时GoTo循环启动和超时才有效?接下来,我建议在
timeout%INTERVAL%
上方插入一个标签,如
:ProcessWait
,并将其作为第一个条件
如果不是错误级别1转到进程等待
。如果errorlevel 1
,则接下来的四个命令行可以没有
。另请参见和。。我喜欢这个想法-如果没有意义-我不知道为什么我不把它看作是一个VBA脚本。。。我唯一关心的是,如果添加该标签将破坏现有部分。。。不过,只有测试才能让我确定。我很快就会回来谢谢你@mofi的反馈
@echo off

:: setting variables/conditions for the loop
:: note interval is number of seconds between loop run

    set folder1="C:\Users\Joseph\Desktop\Testing_1"
    set num=0
    Set Interval=5
    set IPAddress=8.8.8.8
:LoopStart
    ping -n 4 %IPADDRESS% | find "TTL=" > nul
        if not errorlevel 1 goto ProcessWait    
        if errorlevel 1 set /a num=%num% + 1
        if errorlevel 1 set file1="%folder1%\25090_log_%num%.txt"
        if errorlevel 1 echo %date%-%time% >> %file1%
        if errorlevel 1 ping -n 1 %ipaddress% >>%file1%
:ProcessWait
    timeout %INTERVAL%
Goto LoopStart