2015-01-02 2 views
0

Я пытаюсь создать командный файл, который будет обратный отсчет при активации и выходе из системы. Это происходит, когда пользователь больше не находится на компьютере. Я столкнулся с несколькими форумами, где люди делают это, но они выходят из системы в любое время, когда пользователь простаивает в течение x минут или секунд. То, что у меня есть, делает обратный отсчет и отключается или отменяется, и я устанавливаю его в планировщик задач, чтобы начать работу, когда компьютер простаивает. Эта часть работает нормально. Кажется, что я не могу работать правильно, - это делать только обратный отсчет, если время после 18:30 (18:30). Он работал один раз для меня, но я больше не могу работать.Batch Log Off Countdown

Итак, что мне нужно в более конкретной последовательности.

  • Требуется, чтобы проверить время, чтобы убедиться, что после 6:30 вечера
  • потребностей, чтобы выйти, если время еще не 6:30 вечера без взаимодействия с пользователем.
  • начать сеанс последовательности, если время после 6:30 вечера

Материал ниже, кажется, работает прекрасно, как прямо сейчас.

  • нажмите любую буквенную клавишу, чтобы отменить последовательность
  • сила выхода из системы, если последовательность не отменяется

Вот мой код, который сейчас работает, он просто не заботится о том, какое время это.

TITLE Automatic Log Off Initiated! 

mode con:cols=80 lines=1 

COLOR CF 

@echo off 
setlocal enableextensions enabledelayedexpansion 
set tm=%time% 
:: Test data on lines below. 
:: set tm=18:59:59.00 
:: set tm=19:00:00.00 
:: set tm=19:44:59.00 
:: set tm=19:45:00.00 
:: set tm=23:59:59.99 
set hh=!tm:~0,2! 
set mm=!tm:~3,2! 
if !hh! LEQ 18 if !mm! LEQ 30 (
    exit 
) 
else goto :begin 

:begin 
for /l %%N in (600 -1 1) do (
    set /a "min=%%N/60, sec=%%N%%60, n-=1" 
    if !sec! lss 10 set sec=0!sec! 
    cls 
    choice /c:1ABCDEFGHIJKLMNOPQRSTUVWXYZ /n /m "Automatically Logging Off in !min!:!sec! - Press any key or move the mouse to cancel" /t 1 /d 1 
    if not errorlevel 1 goto :break 
    if errorlevel 2 goto :end 
    if errorlevel 3 goto :end 
    if errorlevel 4 goto :end 
    if errorlevel 5 goto :end 
    if errorlevel 6 goto :end 
    if errorlevel 7 goto :end 
    if errorlevel 8 goto :end 
    if errorlevel 9 goto :end 
    if errorlevel 10 goto :end 
    if errorlevel 11 goto :end 
    if errorlevel 12 goto :end 
    if errorlevel 13 goto :end 
    if errorlevel 14 goto :end 
    if errorlevel 15 goto :end 
    if errorlevel 16 goto :end 
    if errorlevel 17 goto :end 
    if errorlevel 18 goto :end 
    if errorlevel 19 goto :end 
    if errorlevel 20 goto :end 
    if errorlevel 21 goto :end 
    if errorlevel 22 goto :end 
    if errorlevel 23 goto :end 
    if errorlevel 24 goto :end 
    if errorlevel 25 goto :end 
    if errorlevel 26 goto :end 
    if errorlevel 27 goto :end 
) 




:break 
shutdown /l /f 

:end 
exit 

Я играл с ним, чтобы проверить время, используя разные времена, но он по-прежнему не работает.

Я также попытался использовать второй оператор IF, но это не сработало.

IF !hh! GTR 18 IF !mm! GTR 30 (
goto :begin 
) 

Любая помощь будет принята с благодарностью! Спасибо!

ответ

0

После пустячный немного больше я заметил в другом файле (копия), что я имел

:begin 
setlocal enableDelayedExpansion 
for... 

как я внимательно посмотрел на двух файлов, которые я заметил заглавные буквы в начале второго и третьего слов. Я изменил это для кода наверху, где он говорит setlocal enableextensions enabledelayedexpansion, и я изменил первые буквы, чтобы быть капиталом setlocal enableExtensions enableDelayedExpansion, который исправил все, и теперь он отменяет и выходит, если время еще не 6:30 вечера, и если его после 6:30 он начинает последовательность выключения и работает прекрасно! так что спасибо за любые ваши мысли, но я сам ответил сам! : D

Надеюсь, это может быть полезно и для кого-то еще в будущем!

+3

Ум, нет - извините. Пакетные ключевые слова нечувствительны к регистру - единственное место, где он распознает случай, - в случае * метапеременных * (переменные для управления контуром). – Magoo

1
set hh=!tm:~0,2! 
set mm=!tm:~3,2! 
if !hh! LEQ 18 if !mm! LEQ 30 (
    exit 
) 
else goto :begin 

Неправильный синтаксис. Ключевое слово «else» должно быть должно быть в той же строке, что и тег close close круглый для оператора if-true.

Что происходит, что это else статьи выдаст сообщение об ошибке, но затем партия переходит к :begin этикетке в любом случае, и сообщение удаляется с экрана в cls внутри цикла for.

Синтаксис !var! не нужен в этой части кода. Это требуется только в кодовом блоке (то есть в скобках с указанием в скобках).

Будьте осторожны. hh или mm может быть установлен с ведущим «0», который пакет рассматривает как , восьмеричный, следовательно 08 и 09 недействительны.

В этом случае партия будет признать, что она не может концерт 08 или 09 поэтому он переходит в нормальный режим (сравнения строк) и правильно сравнивает строки к 18 и 30.

Но вот ловушка. Если вы должны были заменить 30 на 7, тогда вы обнаружите, что 08 и 09 были меньше чем 7. Это связано с тем, что когда вы переключаетесь на режим string-comparison (на самом деле вы не переключитесь в режим числового сравнения, потому что одна или другая часть не может быть преобразована в целое число) сравнение выполняется по-символу из левый и "0" составляет менее "7"

Он работает только потому, что вы выбрали именно тот номер, который вы выбрали. Я называю это неудачным сценарием. Это довольно часто, потому что его не наблюдали неудачно, он, как предполагается, работает, пока однажды кто-то что-то не что-то изменит, и он сломается ...

Следующая проблема - непонимание if errorlevel.

IF ERRORLEVEL n ИСТИНА, если errorlevel n или больше, чем n. IF ERRORLEVEL 0 всегда верно. IF NOT ERRORLEVEL 1 - это тест для errorlevel = 0. Так что IF %ERRORLEVEL%==0, за исключением того, что первый может использоваться внутри блока, но последний не может.

Ваш код настроен для индивидуального тестирования других уровней ошибок. Если вы должны были изменить код

if errorlevel 2 echo TWO&goto :end 
if errorlevel 3 echo THREE&goto :end 

(внешний вид - чтобы сэкономить время, не заморачиваться с напоминанием)

и вставьте pause перед вашим exit

:end 
pause 
exit 

тогда вам 'd видеть сообщение. Нажмите алфавитную клавишу, и отчет будет TWO потому if errorlevel 2 echo TWO&goto :end отзовется TWO и перейти к :end если errorlevel установлен в 2 или больше 2

Если вы действительно используете choice сделать меню, то правильной процедурой является проверка в обратного номера. Это избыточно здесь, потому что с вашим кодом нажатие X (например) установит errorlevel на 25 и 25> 2, поэтому тест для errorlevel 2 завершит процедуру и закроет окно.

Опять же, сценарий неудачной попытки.

+0

Это определенно светит на некоторых вещах, и теперь мне больше спасибо за ваш вклад. Я все еще разрабатываю некоторые изломы (он меня отключил, и это было до 6:30 вечера), но я заменил 'else' с 'if hh GTR 18, если mm GTR 30' и, надеюсь, это поможет. есть ли лучший способ сделать это? Я всегда готов к улучшению. – DomCan