在Windows命令提示符下,如何在一定时间内没有输入就运行一个命令,有输入就运行另一个命令?
In Windows Command prompt, how can I run one command if there is no input, and another if there is, within a certain time?
我不确定如何表达这个问题,但这是我想做的。
如果服务器进程关闭(由“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 秒后服务器将再次启动。
timeout
不 return errorlevel
Request for inclusion in W10 here 因此使用 timeout
,唯一明显的方法是保存 %time% before and see whether the
%time% after 是 15 秒后 - 这充满了问题。
timeout
似乎将调用到该秒结束的时间计算为第一秒,实际上在下一秒的 ~150 毫秒处终止 "second"(可能取决于 CPU加载。)
因此,使用技术术语来说,时间是 "hairy." 第一个 "second" 可以从 150 毫秒左右到 1150 毫秒不等,每增加一秒超时就增加 1000 毫秒(例如,15 秒 = 14.15 秒..15.15 秒)
可能更好的方法是使用 choice
- 在 W7+ AFAIAA 上重新出现。从本质上讲,这将 "interrupting" 键集限制为字母和其他一些 - Space 例如不能作为 "choice" IIRC 使用。
可以检测TIMEOUT是否倒计时到0,或者用户是否按下了一个键。只要超时间隔 >= 10,那么如果 TIMEOUT 倒计时结束,打印的最后两个字符将始终为“0”。因此,您只需使用 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,如果您想循环回到 :start,那么您只需要:
for /f "delims=" %%A in ('timeout 15') do set "test=%%A"
if "%test:~-2%" equ " 0" goto start
我不确定如何表达这个问题,但这是我想做的。
如果服务器进程关闭(由“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 秒后服务器将再次启动。
timeout
不 return errorlevel
Request for inclusion in W10 here 因此使用 timeout
,唯一明显的方法是保存 %time% before and see whether the
%time% after 是 15 秒后 - 这充满了问题。
timeout
似乎将调用到该秒结束的时间计算为第一秒,实际上在下一秒的 ~150 毫秒处终止 "second"(可能取决于 CPU加载。)
因此,使用技术术语来说,时间是 "hairy." 第一个 "second" 可以从 150 毫秒左右到 1150 毫秒不等,每增加一秒超时就增加 1000 毫秒(例如,15 秒 = 14.15 秒..15.15 秒)
可能更好的方法是使用 choice
- 在 W7+ AFAIAA 上重新出现。从本质上讲,这将 "interrupting" 键集限制为字母和其他一些 - Space 例如不能作为 "choice" IIRC 使用。
可以检测TIMEOUT是否倒计时到0,或者用户是否按下了一个键。只要超时间隔 >= 10,那么如果 TIMEOUT 倒计时结束,打印的最后两个字符将始终为“0”。因此,您只需使用 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,如果您想循环回到 :start,那么您只需要:
for /f "delims=" %%A in ('timeout 15') do set "test=%%A"
if "%test:~-2%" equ " 0" goto start