Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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 Windows批处理中的闹钟服务_Batch File_Command Prompt - Fatal编程技术网

Batch file Windows批处理中的闹钟服务

Batch file Windows批处理中的闹钟服务,batch-file,command-prompt,Batch File,Command Prompt,我正在尝试通过CMD提示符创建闹钟服务。该服务可以编程到特定的时间,并在终止前播放歌曲和提问。我遇到了两个困难: 1) 当到达if/else语句时,命令提示窗口打开,然后关闭(在if/else语句后甚至不会暂停,如下所述)。我的if语句是否有错误?它实际上一直在工作,直到时间变为晚上11点,然后错误的行为开始了 2) 在for循环中使用more读取文件()的第n行时,在if/else语句开始出错之前,出现了一个错误,即无法访问文件(filename)。有什么想法吗 @ECHO OFF rem A

我正在尝试通过CMD提示符创建闹钟服务。该服务可以编程到特定的时间,并在终止前播放歌曲和提问。我遇到了两个困难:

1) 当到达
if/else
语句时,命令提示窗口打开,然后关闭(在
if/else
语句后甚至不会暂停,如下所述)。我的
if
语句是否有错误?它实际上一直在工作,直到时间变为晚上11点,然后错误的行为开始了

2) 在for循环中使用
more
读取文件()的第n行时,在if/else语句开始出错之前,出现了一个错误,即
无法访问文件(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: 最可能的问题是变量
mytime
没有设置值(这表明for循环在不起作用之前就已经存在了)。作为一般预防措施,在if语句中应始终使用

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

set mytime=%time:~0,2%%time:~3,2%
这应该可以解决问题1(就像您的if语句不应该崩溃一样)

问题2: 在批处理中,引用
…方括号…
中的变量时,您将在方括号开始之前引用变量的值。因此,您的变量不存在

要解决此问题,我们使用
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

这应该对你有用。

谢谢@Monacraft-问题1通过你的解决方案解决了,但问题2只解决了一部分。首先,我需要加引号(“”)围绕
more+!\u rand!…
语句正确读取文本文件。不幸的是,在命令窗口中,文本文件没有被正确读取,变量
myquestion
myanswer
根本没有被设置。这在尝试访问
!myquestion!
时可以看到。有什么想法吗?最后,可以您可以解释我的代码中如何没有循环?或者为什么需要循环?谢谢您的帮助!尝试我编辑的代码解决方案。此外,如果我的解决方案有帮助,请不要忘记正确标记。不幸的是,脚本不允许我使用
无法访问文件(文件目录)访问文件
错误。此错误仅在使用
more
命令时出现-您对原因有何建议?再次感谢迄今为止的帮助!