Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 循环中的批处理文件选择_Batch File - Fatal编程技术网

Batch file 循环中的批处理文件选择

Batch file 循环中的批处理文件选择,batch-file,Batch File,我发现使用choice命令很简单。。但是如果我想把它用在时钟上呢 所以我有一个循环时钟,它会一直持续,但当我按下“m”时,我希望它能打开一个菜单 @Echo off :clock ::do stuff here choice /c m /n ::Errorlevelstuff goto :clock 但是选择让它等待。。 我提出的唯一解决方案是使用/t,但它增加了一个时间,我不希望“我正在使用另一个变量来设置时钟的滴答声频率”,所以 有没有办法检查是否有人在时钟循环中按了键 简单回答

我发现使用choice命令很简单。。但是如果我想把它用在时钟上呢 所以我有一个循环时钟,它会一直持续,但当我按下“m”时,我希望它能打开一个菜单

@Echo off

:clock

::do stuff here

choice /c m /n

::Errorlevelstuff

goto :clock
但是选择让它等待。。 我提出的唯一解决方案是使用/t,但它增加了一个时间,我不希望“我正在使用另一个变量来设置时钟的滴答声频率”,所以

有没有办法检查是否有人在时钟循环中按了键

简单回答 使用
choice/t
作为您的时钟

@echo off
setlocal
set "count=0"
:clock
echo Seconds: %count%
choice /t 1 /c am /d a >nul
if %ErrorLevel% equ 2 goto done
set /a "count+=1"
goto clock
:done
echo Menu
pause
endlocal
注意:选择的超时粒度限制为秒,范围为1到9999秒。此外,使用基于软件的时钟会出现时间衰减。根据粗略的快速测试,这大约每秒衰减1/10秒。也就是说,每10秒,这个时钟就会松动1秒

OP的相关职位

无衰减时钟示例 从那时起,我创建了这个时钟,它不受脚本衰减的影响,因为它会根据操作系统时钟的每一个滴答声进行调整。也就是说,即使脚本中有衰减,时钟也不会显示错误的时间

@echo off
setlocal
:initialize
set "s=10"
set "m=10"
:: Note Offset
set "xs=%time:~6,1%" & set "sx=%time:~7,1%"
set "xm=%time:~3,1%" & set "mx=%time:~4,1%"
set "so=%xs:0=%%sx%" & set "mo=%xm:0=%%mx%"
echo Offset: %mo% : %so%
:process
:: Calculate Changes
set "xs=%time:~6,1%" & set "sx=%time:~7,1%"
set "xm=%time:~3,1%" & set "mx=%time:~4,1%"
set "xs=%xs:0=%" & set "xm=%xm:0=%"
if %xs%%sx% lss %so% set "xs=60+%xs%"
if %xm%%mx% lss %mo% set "xs=60+%xm%"
set /a "s=%xs%%sx%-%so%"
if %s% equ 0 set /a "m=%xm%%mx%-%mo%"
:: Pause Processing supports millisecond delay but not input checking
::ping 192.0.2.2 -n 1 -w 200 >nul
:: Break Check supports input checking but not millisecond delay
choice /T 1 /C am /D a >nul
if %ErrorLevel% equ 2 goto menu
:display
:: Detect Lag
set "w="
if %s%0 equ %bs%0 goto process
if %s%0 lss %bs%0 set "w=lag detected"
if %s%0 geq %es%0 set "w=lag detected"
:: Format Output
set "mm=00%m%"
set "ss=00%s%"
set "bm=%m%"
set "bs=%s%"
set /a "es=%s%+2"
:: Display
echo Clock: %mm:~-2% : %ss:~-2% %w%
goto process
:menu
echo Menu
endlocal
exit /b 0
注意:这是基于en US时间格式

输出示例

Offset: 45 : 10
Clock: 00 : 01 lag detected
Clock: 00 : 02
Clock: 00 : 03
Clock: 00 : 04
Clock: 00 : 05
Clock: 00 : 06
Clock: 00 : 07
Clock: 00 : 08
Clock: 00 : 09
Clock: 00 : 11 lag detected
Clock: 00 : 12
Clock: 00 : 13
Clock: 00 : 14
Clock: 00 : 15
Clock: 00 : 16
Clock: 00 : 17
Clock: 00 : 18
Clock: 00 : 19
Clock: 00 : 20
Clock: 00 : 21
Menu

选择是否比ping/超时更准确?顺便说一句,我需要能够使用ms作为我的滴答率D:但是使用t=1并向其中添加ms是可以的,我使用的是您给我的方法,但有时它崩溃,有时它工作D:@xdeath选项比ping/timeout更糟糕,但对于单线程应用程序,这是目前我唯一能想到的在每次勾选期间检查输入的方法。choice命令的粒度限制为秒,不允许毫秒。是否有任何关于崩溃的错误消息?系统无法找到指定的批次标签:菜单问题是,如果我正确计时,它就会工作。。否则它会停止时钟,如果我再次按m,它会中断,甚至有时它会随机中断(D:thnx:)但这不像一个正常的时钟:P我正在使用一个你可以切换它有多快的时钟。但我将尝试从%date%集成检查。。再次感谢您的想法:)