首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows批处理中的闹钟服务

Windows批处理中的闹钟服务
EN

Stack Overflow用户
提问于 2015-01-27 04:43:35
回答 1查看 4.3K关注 0票数 0

我正试图通过CMD提示创建一个闹钟服务。该服务可以编程到一定的时间,并在结束前播放一首歌并提出一个问题。我遇到了两个困难:

1)命令提示符窗口打开,然后在到达if/else语句时关闭(以下代码甚至不会在if/else之后暂停)。我的if声明有问题吗?从字面上讲,它一直在工作,直到晚上11点,然后错误的行为开始了。

2)使用for循环中的more读取文件(https://stackoverflow.com/a/6410343/3746582)的第n行时会出现错误,在if/语句开始出错之前说是Cannot access file (filename)。有什么想法吗?

代码语言:javascript
复制
@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

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-01-27 08:15:43

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

问题1:

最可能的问题是变量mytime没有值集(这意味着for循环在它不能工作之前)。作为一般预防措施,您应该始终使用"'s in if语句。

代码语言:javascript
复制
if "%mytime%" EQU "2328" (

至于for -循环,我建议改为使用变量语法(set /? | more +78)。将for-循环替换为:

代码语言:javascript
复制
set mytime=%time:~0,2%%time:~3,2%

这应该可以解决问题1(就像您的if语句不应该崩溃一样)。

问题2:

在批处理中,引用(...brackets.)中的一个变量,您将引用变量的值,然后是方括号的开头。因此,您的变量不存在!

为了解决这个问题,我们使用setlocal enabledelayedexpansion (Setlocal /?),在括号内用!替换%

最后一件可以解释为什么您的代码不能工作的事情是,没有循环!你可以用一个简单的goto循环。我已将goto语句添加到您的代码中。

我还将"usebackq"添加到for语句中,这样more命令才能工作。

因此,完成的代码应该如下所示:

代码语言:javascript
复制
@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

这应该对你有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28163404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档