我想用Windows批处理文件启动一个程序。但是程序应该在某个超时值后停止。例如:运行程序 60 秒,60 秒后停止程序。
在 Linux 下,有一个不错的timeout
命令来做我想做的事。Windows也有一个timeout
命令,但它只是暂停命令,延迟它的执行。在Windows下还有其他东西可以这样做吗?
设置: 视窗 7, 64 位, 专业
start yourprogram.exe
timeout /t 60
taskkill /im yourprogram.exe /f
Bali C给出了一个简洁而中肯的答案。我需要一些更有功能和可重用的东西。以巴厘岛C为例。我想出了这个。如果有人需要和我一样。
你的.bat
REM...
CALL STARTwaitKILL..bat /relative/path/your_program.exe
REM...
开始等待杀戮
.BAT@ECHO OFF
IF[%1]==[] GOTO EOF
IF NOT EXIST %1 GOTO EOF
REM SET PRIORITY=/NORMAL
REM ADJUST PRIORITY, BELOWNORMAL LETS BATCH FILE RUN MORE SMOOTHLY
REM WITH A PROGRAM THAT CONSUMES MORE CPU. SEE ABOUT MAXWAIT BELLOW
SET PRIORITY=/BELOWNORMAL
REM SET PRIORITY=/LOW
REM 0 NORMAL WINDOW :: 1 NO WINDOW :: 2 MINIMIZED WINDOW
SET /A HIDDEN=1
REM MAXWAIT HERE IS MORE LIKE MINIMUM WAIT IN WINDOWS.
SET MAXWAIT=10
SET WAITCOUNT=0
SET ARGS=/I %PRIORITY%
IF %HIDDEN% EQU 1 SET ARGS=%ARGS% /B
IF %HIDDEN% EQU 2 SET ARGS=%ARGS% /MIN
START %ARGS% %1
:WAIT
IF %WAITCOUNT% GEQ %MAXWAIT% GOTO KILL_IT
TIMEOUT /T 1 > NUL
SET /A WAITCOUNT+=1
FOR /F "delims=" %%a IN ('TASKLIST ^| FIND /C "%~nx1"') DO IF %%a EQU 0 GOTO RUN_DONE
GOTO WAIT
:KILL_IT
TASKKILL /IM %~nx1 /F > NUL
:RUN_DONE
可以充实矿石以获得更多的优先级论据等等,但我不需要它。应该不难添加。
Windows 中不存在任何用于延迟应用或设置应用超时的命令
Windows中的超时用于延迟CMD/Batfile的执行过程,仅此而已。
你可以使用外部工具,我现在不记得任何名称了,这么多地下软件,对不起,但我记得在autoit官方论坛中存在一个类似的命令行工具来启动一个设置超时的应用程序,也许在工具NIRCMD或ps2exec中,检查他们的帮助文件或WAIK套件中的某人。
这是您唯一可以执行的操作:
@Echo OFF
:: First launch the app in background mode, because some applications stops the execution of CMD.
Start /B ".DirYour app.exe"
:: Then stay in background for a certain time
Timeout /T "Seconds"
:: Continue your code...
Pause&Exit
start
+ timeout
+ taskkill
正好等待给定的时间。由于如果进程提前退出,我需要停止等待,因此我在 C++ 年创建了自己的解决方案。
tuxliketimeout
程序模仿 GNU 超时。随意下载和编译
https://github.com/cernoch/tuxliketimeout
在 Windows 10 中,最简单的方法是使用 scriptrunner:
通过运行暂停命令来演示超时(这将杀死被调用的进程):
ScriptRunner.exe -appvscript cmd "/c" "pause" -appvscriptrunnerparameters -wait -timeout=20
Wait-Job
来实现此目的。如果命令没有超时,它将立即返回,因此您不必等待整个时间。当同一应用程序的多个实例像Bali C的答案一样运行时,它也不会失败。只需通过在 PowerShell 中运行notepad $PROFILE
将以下函数放入配置文件中并粘贴此代码片段
Function Invoke-WithTimeOut {
Param (
[int]$timeout,
[scriptblock]$script
)
$job = Start-Job $script
$done = $job | Wait-Job -TimeOut $timeout
if (-not $done) { Stop-Job $job }
}
然后,您可以在任何PowerShell会话中使用它。例如,在 40 秒超时的情况下运行yourprogram.exe
Invoke-WithTimeOut 40 { yourprogram.exe }
您可以从这样的批处理文件中调用它
powershell -C "Invoke-WithTimeOut 40 { yourprogram.exe }"
但是现在最好使用PowerShell。
当然,如果您只想这样做一次,您也可以直接运行它
$job = sajb { yourprogram.exe }
if (-not ($job | wjb -T 60)) { spjb $job }
您可以将Start-Job
/Wait-Job
更改为Start-Process
/Wait-Process
这将产生与npocmaka的ScriptRunner.exe
解决方案相同的结果