如何在cmd中设置命令超时

时间:2018-12-30 10:52:01

标签: batch-file timeout

我想运行一个命令,如果它在1秒内没有完成,我希望它返回31744。

示例:

C:\Users\Admin\Desktop\my_django_stuff>mycommand < input.txt > output txt 
timeout /t 1

这给了我一个语法错误,如果我的命令的运行时间是无限的,那么它在1秒后也不会停止。

2 个答案:

答案 0 :(得分:1)

这是一个可能的解决方案:

@echo off

start "custom" mycommand < input.txt > output txt 
timeout /t 1
taskkill /FI "WINDOWTITLE eq custom" /FI "IMAGENAME eq mycommand" /f | findstr /c:"PID" >nul
if errorlevel 1 (
    echo Task was killed!
    pause>nul
    exit /b 0
) else (
    echo The task was killed successfully! Will exit with code your_custom_code
    pause>nul
    exit /b your_custom_code
)

现在,您确定程序已终止( f 已强制终止)。

请注意,这里我们使用timeout代替ping,因为它肯定会持续不到1/4秒。因此,taskkill会持续一会儿,因此您肯定会有超过1秒的时间。

答案 1 :(得分:1)

start "UniqueWindowTitle" mycommand < input.txt > output txt
ping -n 2 localhost >nul
taskkill /FI "WINDOWTITLE eq UniqueWindowTitle" /f |find " PID " && (
   echo task was killed.
   exit /b 31744
) || (
   echo there was no task to kill.
   echo it terminated in time.
)

不幸的是,taskkill不会返回有用的错误级别,因此我们解析输出(如果任务被杀死,则为SUCCESS: Sent termination signal to the process with PID 12345
根据您的实际应用,您可能需要或不需要/f参数(“ Force”)

我将timeout替换为ping-n 2 localhost,因为timeout 1实际上并不等待1秒,而是等到“下一秒”到来-在极端情况下可能只有几毫秒。 >

此外,我并没有寻找“ SUCCESS”,而是寻找了“ PID”来保持其语言独立性。 (当找不到该进程时,没有PID