在Windows命令提示符下,如果没有输入,如何在一定时间内运行另一个命令?

时间:2015-01-02 15:38:22

标签: windows batch-file command-prompt

我不确定如何表达这个问题,但这就是我想做的事。

如果服务器进程关闭(由" ping 1.1.1.1 -n 1 -w 3000 >nul"确定),我想提示用户按任意键关闭服务器,但如果用户没有按一个键让服务器再次运行。这是我目前的剧本:

@echo off
:start
echo (%time%) Server started.
"C:\jdk1.7.0_72\bin\java.exe" -server -d64 -Xmx4G -Xms1G -XX:+UseConcMarkSweepGC -XX:-UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=50 -XX:+DisableExplicitGC -XX:+AggressiveOpts -Xmn512M -jar spigot.jar nogui
echo (%time%) WARNING: Server closed or crashed, restarting.
ping 1.1.1.1 -n 1 -w 3000 >nul
timeout 15
goto start

如您所见,我已经拥有了重启功能,并且完美运行。因此,要澄清:如果用户按下某个键,服务器将关闭并且不会重新启动。如果用户未按任何键,则15秒后服务器将再次启动。

2 个答案:

答案 0 :(得分:1)

可以检测TIMEOUT是否倒计时为0,或者用户是否按了一个键。只要超时间隔> = 10,那么打印的最后两个字符将始终为" 0"如果TIMEOUT完成倒计时。所以你只需要用FOR / F命令捕获输出并测试最后两个字符。

唯一可能的问题是您将不再在屏幕上看到倒计时。

@echo off
for /f "delims=" %%A in ('timeout 15') do set "test=%%A"
if "%test:~-2%" equ " 0" (
  echo The user did NOT press a key
) else (
  echo The user pressed a key
)

如果超时间隔是< 10,然后你只检查最后一个字符,看它是否为0。

@echo off
for /f "delims=" %%A in ('timeout 5') do set "test=%%A"
if "%test:~-1%" equ "0" (
  echo The user did NOT press a key
) else (
  echo The user pressed a key
)

关于如何将其纳入您的代码 - 我并不积极,因为我不完全理解您的代码应该做什么。

您的PING命令无法确定服务器是否已关闭,也无法关闭服务器。它只是在你的脚本中引入了3秒的延迟。

如果你想回到:如果在没有用户按键的情况下完成TIMEOUT就开始,那么你只需要:

for /f "delims=" %%A in ('timeout 15') do set "test=%%A"
if "%test:~-2%" equ " 0" goto start

答案 1 :(得分:0)

timeout未使用errorlevel返回timeout Request for inclusion in W10 here,唯一明显的方法是在15后保存%time% before and see whether the%时间%秒之后 - 那充满了问题。

timeout似乎计算从调用到第二秒结束的时间段,作为实际终止"第二个"的第一秒。在下一秒~150ms(可能取决于CPU负载。)

因此,时间是,使用一个术语,"多毛。"第一个"秒"可以从150毫秒左右到1150毫安,只需加上1000毫秒即可超时(15秒= 14.15Sec..15.15Sec,例如)

可能更好的方法是使用choice - 重新出现在W7 + AFAIAA上。从本质上讲,这会限制"中断" alphamerics的键集和其他一些 - 例如 Space 不能作为"选择" IIRC。