如何在Windows 7下设置进程超时?

x7rlezfr  于 2023-06-24  发布在  Windows
关注(0)|答案(6)|浏览(194)

我想用Windows批处理文件启动一个程序。但是程序应该在某个超时值之后停止。例如:运行程序60秒,60秒后停止。
在Linux下,有一个很好的timeout命令来做我想做的事情。Windows也有一个timeout命令,但它只是暂停命令,延迟它的执行。Windows下还有其他功能吗?
安装程序:Windows 7,64位,专业版

yqkkidmi

yqkkidmi1#

start yourprogram.exe
timeout /t 60
taskkill /im yourprogram.exe /f
ltskdhd1

ltskdhd12#

Bali C给出了一个简明扼要的回答。我需要一些更有特色和可重用的东西。以Bali C为例。我想到了这个。如果有人需要和我一样的东西。
your.bat

REM...

CALL STARTwaitKILL..bat /relative/path/your_program.exe

REM...

STARTwaitKILL.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

可以充实矿石采取更多的论点优先等,但我没有必要。应该不难添加。

zwghvu4y

zwghvu4y3#

Windows中不存在任何用于延迟应用程序或设置应用程序超时的命令
Windows中的超时是为了延迟CMD/Batfile的执行过程,没有更多的实用程序。
你可以使用外部工具,我不记得任何现在的名字,这么多地下软件,对不起,但我记得,在autoit官方论坛存在一个类似的命令行工具来启动一个应用程序设置超时,也许在工具NIRCMD,或ps2 exec,检查他们的帮助文件,或有人在WAIK工具包。
这是你唯一能做的:

@Echo OFF

:: First launch the app in background mode, because some applications stops the execution of CMD.
Start /B ".\Dir\Your app.exe"

:: Then stay in background for a certain time
Timeout /T "Seconds"

:: Continue your code...
Pause&Exit
6mzjoqzu

6mzjoqzu4#

start + timeout + taskkill等待精确给定的时间。因为我需要如果进程提前退出就停止等待,所以我用C++创建了自己的解决方案。
tuxliketimeout程序模仿GNU timeout。请随时下载并编译自
https://github.com/cernoch/tuxliketimeout

gywdnpxw

gywdnpxw5#

在Windows 10中,最简单的方法是使用scriptrunner
通过运行pause命令来演示超时(这将杀死被调用的进程):

ScriptRunner.exe -appvscript cmd "/c" "pause" -appvscriptrunnerparameters -wait -timeout=20
ctzwtxfj

ctzwtxfj6#

你可以使用Wait-Job来实现。如果命令没有超时,它会立即返回,因此您不必等待全部时间。当同一应用程序有多个示例运行Bali C's answer时,它也不会失败。只需通过在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 s超时运行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,这将产生与ScriptRunner.exe solution by npocmaka相同的结果

相关问题