我正在尝试通过CMD提示创建闹钟服务。该服务可以编程到一定时间,并在终止之前播放歌曲并提出问题。我遇到了两个困难:
1)命令提示符窗口打开,然后在到达if/else
语句时关闭(在if/else
之后甚至没有按下面的代码暂停)。我的if
声明有问题吗?它一直在工作,直到时间变为晚上11点,然后故障行为开始了。
2)在for循环中使用more
来读取文件的第n行(https://stackoverflow.com/a/6410343/3746582),在if / else语句开始出错之前发出错误Cannot access file (filename)
。有什么想法吗?
@ECHO OFF
rem Alarm generated that won't turn off until interacted by user.
rem Get time
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
if %mytime% == 2328 (
start wmplayer "C:\Users\Public\Music\Sample Music\Kalimba.mp3"
pause
rem Stop music with user input
taskkill /im "wmplayer.exe"
rem Pick random question
SET /a _rand=%RANDOM%*216929/32768+1
SET /a _rand-=1
For /f "tokens=6-7 delims=," %%a in (more +%_rand% 'JEOPARDY_CSV.txt') do (set /a myquestion = %%a && set /a myanswer = %%b)
set /p userinp=Answer the question of the day! %myquestion%:%=%
pause
) else (
pause
)
pause
谢谢!
答案 0 :(得分:0)
以下是解决您的两个问题的方法:
最可能的问题是变量mytime
没有设置值(这表示for循环在它不起作用之前)。作为一般预防措施,您应该在if语句中使用"
。
if "%mytime%" EQU "2328" (
至于你的for-loop,我建议改为使用变量语法(set /? | more +78
)。用以下代码替换你的for循环:
set mytime=%time:~0,2%%time:~3,2%
这应该解决问题1(因为你的if语句不应该崩溃)。
在批处理中,引用(
...括号中的变量... )
,您将引用变量的值 BEFORE 括号的开头。因此你的变量不存在!
要解决此问题,我们使用setlocal enabledelayedexpansion
(Setlocal /?
),在括号内我们将%
替换为!
。
最后一件事可以解释为什么你的代码不起作用是没有循环!你可以使用一个简单的goto循环。我已将goto语句添加到您的代码中。
我还在for语句中添加了"usebackq"
,因此more
命令可以正常工作。
所以你完成的代码应该是这样的:
@ECHO OFF
setlocal enabledelayedexpansion
title Alarm Clock
:loop
set mytime=%time:~0,2%%time:~3,2%
if "%mytime%" EQU "2328" (
start wmplayer "C:\Users\Public\Music\Sample Music\Kalimba.mp3"
pause
rem Stop music with user input
taskkill /im "wmplayer.exe"
rem Pick random question
SET /a _rand=!RANDOM!*216929/32768+1
SET /a _rand-=1
For /f "usebackq tokens=6-7 delims=," %%a in ('more +!_rand! JEOPARDY_CSV.txt') do (set /a myquestion = %%a && set /a myanswer = %%b)
set /p userinp=Answer the question of the day !myquestion!:%=%
pause
) else (
goto loop
)
pause
endlocal
哪个应该适合你。