20秒后停止执行批处理文件并移至下一步

时间:2013-01-21 16:51:28

标签: windows batch-file command

我有一个从网上获得的小脚本。该脚本基本上从文件中读取信息(IP地址)并对其进行ping操作,然后将结果插入到文本文件中。这个脚本正是我需要的,但问题是我需要“路径”而不是ping,我可以在脚本中更改。问题是在路径中如果有延迟,脚本会在3分钟或5分钟内停留,具体取决于响应,然后再转移到下一个IP地址。

我想要的只是某种时间,基本上可能是20秒,无论响应是什么,都会移动到下一条记录。有人可以修改下面的脚本,以便pathping命令等待30秒,然后移动到下一行信息(独立于响应是什么)。任何提示或方向将不胜感激...谢谢。

我已检查超时-w或-p选项不起作用。

@echo off
cls
echo PathPing test in progress...

for /F %%i in (iplist.txt) do pathping %%i >> result.txt

echo .
echo .
echo Result is ready.    

非常感谢。

1 个答案:

答案 0 :(得分:0)

我知道这是一篇过时的文章,但我希望以后能为他人提供帮助。下面的脚本将从iplist.txt文件获取每个地址,并且pathping每个地址仅需20秒。然后,每个结果将输出到result.txt文件中。

现在由于pathping命令的工作方式,“停止”命令的唯一方法是终止CMD窗口本身。由于批处理代码的原因,一次不能运行两行(例如,与C ++不同),因此我们可以使用start "" cmd /C ""命令来召唤两个新窗口。

对于每个地址,我们召集一个pathping窗口和一个taskkill窗口。 Taskill窗口将使用路径窗口的任务PID #,并等待20秒才能终止。

同时,核心批处理文件将等待40秒,所有文件都将关闭并关闭。然后它将所有数据合并到result.txt文件中。

@ECHO OFF
@SETLOCAL enableextensions enabledelayedexpansion
@TITLE PathPing from textfile, cancel request for each x after 20s.
@GOTO :Start

:Start

echo WARN: Starting PathPing Script...
echo WARN: This may take some time...
goto :PathPing

:PathPing

:: Large number is for token gathering
set /a number=123456789
for /f "delims== tokens=1,2" %%G in (iplist.txt) do (

    :: Start The pathping's for each %%G
    start "!number!" cmd /C "pathping "%%G" >> "!number!.outputfile""

    :: Start Kill Window (Let process live for 20 seconds)
    FOR /F "tokens=2" %%# in ('tasklist /v ^| find "!number!" ^| find "Console"') do set PID=%%#
    start "" cmd /C "(PING localhost -n 20 >nul) & (taskkill /pid !PID! /t /f & goto :eof)"

    set /a number+=1
)

:: End of FOR statement. Now copy .outputfile to one file.
:: Wait 60 Seconds for the FOR statement to finish copy there files.
PING localhost -n 30 >nul

:: DEL is optional, remove it if you don't with to over-wright text file.
If exist "%~dp0\result.txt" (goto :Del) ELSE (goto :Skip)

:Del
Del /Q "%~dp0\result.txt"
Goto :Skip

:Skip
For %%A In (*.outputfile) DO (for /f "delims== tokens=1,2" %%G in (%%A) do echo %%G >> result.txt)

:: Clean up all .outputfile files.
For %%A In (*.outputfile) DO (DEL /Q "%~dp0\%%A")
Goto :Finish

:Finish
cls
echo WARN: Result is ready.
echo(
pause
goto :eof