我正试图通过CMD提示创建一个闹钟服务。该服务可以编程到一定的时间,并在结束前播放一首歌并提出一个问题。我遇到了两个困难:
1)命令提示符窗口打开,然后在到达if/else语句时关闭(以下代码甚至不会在if/else之后暂停)。我的if声明有问题吗?从字面上讲,它一直在工作,直到晚上11点,然后错误的行为开始了。
2)使用for循环中的more读取文件(https://stackoverflow.com/a/6410343/3746582)的第n行时会出现错误,在if/语句开始出错之前说是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谢谢!
发布于 2015-01-27 08:15:43
以下是解决这两个问题的方法:
问题1:
最可能的问题是变量mytime没有值集(这意味着for循环在它不能工作之前)。作为一般预防措施,您应该始终使用"'s in if语句。
if "%mytime%" EQU "2328" (至于for -循环,我建议改为使用变量语法(set /? | more +78)。将for-循环替换为:
set mytime=%time:~0,2%%time:~3,2%这应该可以解决问题1(就像您的if语句不应该崩溃一样)。
问题2:
在批处理中,引用(...brackets.)中的一个变量,您将引用变量的值,然后是方括号的开头。因此,您的变量不存在!
为了解决这个问题,我们使用setlocal enabledelayedexpansion (Setlocal /?),在括号内用!替换%。
最后一件可以解释为什么您的代码不能工作的事情是,没有循环!你可以用一个简单的goto循环。我已将goto语句添加到您的代码中。
我还将"usebackq"添加到for语句中,这样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这应该对你有用。
https://stackoverflow.com/questions/28163404
复制相似问题