Служба будильника в пакете Windows

Пытаюсь создать службу будильника через CMD Prompt. Услуга может быть запрограммирована на определенное время, она будет воспроизводить песню и задавать вопрос перед завершением. У меня две трудности:

1) Окно командной строки открывается, а затем закрывается, когда достигает оператора if/else (даже не останавливается после if/else, как показано ниже). Моя if инструкция неверна? Он работал буквально до тех пор, пока время не изменилось на 23:00, а затем началось некорректное поведение.

2) Использование more в цикле for для чтения n-й строки файла (https://stackoverflow.com/a/6410343/3746582) выдавал ошибку Cannot access file (filename) перед тем, как оператор if / else начал давать сбой. Есть предположения?

@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

Спасибо!


person rselvak6    schedule 27.01.2015    source источник


Ответы (1)


Вот решение обеих ваших проблем:

Проблема 1:

Наиболее вероятная проблема заключается в том, что для переменной mytime не задано значение (что предполагает цикл for, прежде чем он перестанет работать). В качестве общей меры предосторожности вы всегда должны использовать " в операторах if.

if "%mytime%" EQU "2328" (

Что касается вашего цикла for, я бы рекомендовал вместо этого использовать синтаксис переменных (set /? | more +78). Замените цикл for на:

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

И это должно решить проблему 1 (так как в вашем операторе if не должно происходить сбоев).

Проблема 2:

В пакетном режиме, ссылаясь на переменную в _6 _... скобках ..._ 7_, вы будете ссылаться на значение переменной ДО начала скобок. Следовательно, ваших переменных не существует!

Чтобы исправить это, мы используем 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

Что должно сработать для вас.

person Monacraft    schedule 27.01.2015
comment
Спасибо @Monacraft - проблема 1 решена вашим решением, а проблема 2 решена только частично. Во-первых, мне нужно было заключить оператор more +!_rand!... в кавычки (), чтобы правильно прочитать текстовый файл. К сожалению, в командном окне текстовый файл не читается должным образом, а переменные myquestion и myanswer вообще не устанавливаются. Это видно при попытке доступа к !myquestion!. Есть предположения? Наконец, не могли бы вы объяснить, почему в моем коде не было цикла? Или зачем нужен шлейф? Спасибо вам за помощь! - person rselvak6; 27.01.2015
comment
Попробуйте мое решение с отредактированным кодом. Также, если мое решение полезно, не забудьте отметить его правильно - person Monacraft; 28.01.2015
comment
К сожалению, сценарий не позволяет мне получить доступ к файлу с ошибкой Cannot access file (file directory). Эта ошибка возникает только при использовании команды more. Есть ли у вас какие-либо предложения относительно того, почему это так? Еще раз спасибо за помощь! - person rselvak6; 28.01.2015