Windows批处理中的闹钟服务

时间:2015-01-27 04:43:35

标签: batch-file command-prompt

我正在尝试通过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

谢谢!

1 个答案:

答案 0 :(得分:0)

以下是解决您的两个问题的方法:

问题1:

最可能的问题是变量mytime没有设置值(这表示for循环在它不起作用之前)。作为一般预防措施,您应该在if语句中使用"

if "%mytime%" EQU "2328" (

至于你的for-loop,我建议改为使用变量语法(set /? | more +78)。用以下代码替换你的for循环:

set mytime=%time:~0,2%%time:~3,2%

这应该解决问题1(因为你的if语句不应该崩溃)。

问题2:

在批处理中,引用( ...括号中的变量... ),您将引用变量的值 BEFORE 括号的开头。因此你的变量不存在!

要解决此问题,我们使用setlocal enabledelayedexpansionSetlocal /?),在括号内我们将%替换为!

最后一件事可以解释为什么你的代码不起作用是没有循环!你可以使用一个简单的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

哪个应该适合你。