【问题标题】:Batch Log Off Countdown批量注销倒计时
【发布时间】:2015-01-02 14:52:46
【问题描述】:

我正在尝试创建一个批处理文件,该批处理文件将在系统激活和注销时进行倒计时。这适用于用户不再在计算机旁的情况。我遇到过多个论坛,人们正在这样做,但只要用户空闲 x 分钟或秒,他们就会注销。我所拥有的确实倒计时并注销或取消,并且我在任务计划程序中将其设置为在计算机空闲时启动。那部分工作正常。我似乎无法正常工作的是,如果时间在下午 6:30(18:30)之后才执行倒计时。它对我有用过一次,但我不能再让它工作了。

所以我需要更具体的顺序。

  • 需要检查时间以确保在下午 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
)

非常感谢任何帮助!谢谢!

【问题讨论】:

    标签: batch-file cmd logoff


    【解决方案1】:
    set hh=!tm:~0,2!
    set mm=!tm:~3,2!
    if !hh! LEQ 18 if !mm! LEQ 30 (
        exit
    )
    else goto :begin
    

    语法不正确。 “else”关键字必须if-true 操作语句的右括号位于同一行。

    发生的情况是这个else 子句将产生一条错误消息,但无论如何批处理都会继续到:begin 标签,并且for 循环中的cls 从屏幕上清除该消息。

    这部分代码不需要!var! 语法。它仅在代码块中需要(即括号内的一系列语句。)

    小心。 hhmm 可以设置前导“0”,这批认为是八进制,因此0809 无效。

    在这种情况下,batch 将识别出它无法与 0809 进行协调,因此它会切换到正常(字符串比较)模式并正确地将 字符串18 进行比较和30

    但这是一个陷阱。如果您将30 替换为7,那么您会发现0809小于7。这是因为当您“切换”到string-comparison 模式时(实际上您不要切换到数字比较模式,因为一侧或另一侧无法转换为整数)比较是从左边逐个字符执行,"0" 小于 "7"

    这似乎只是因为您选择的特定数字不会违反此机制。我称之为失败到失败的场景。这很常见 - 因为它没有被观察到失败,它被认为是有效的,直到有一天有人改变了一些东西并且它坏了......

    下一个问题是对if errorlevel的误解。

    如果errorlevel 为 n或大于 n

    IF ERRORLEVEL n 为 TRUE。 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
    

    (看 - 为了节省时间,不要打扰提醒)

    并在您的exit 之前插入一个pause

    :end
    pause
    exit
    

    然后您会看到生成的消息。按字母键,报告将是TWO,因为if errorlevel 2 echo TWO&goto :end 将回显TWO,如果errorlevel 设置为2或大于2,则转到:end p>

    如果你真的是用choice做菜单,那么正确的步骤是按倒数顺序进行测试。这里是多余的,因为在您的代码中,按下X(例如)会将errorlevel 设置为25 和25>2,因此errorlevel2 的测试将退出过程并关闭窗口。

    又是一个失败到失败的场景。

    【讨论】:

    • 这确实让我明白了一些事情,现在对我来说更有意义了谢谢你的意见我还在解决一些问题(它已经让我退出了,现在是下午 6:30 之前)但我用if hh GTR 18 if mm GTR 30 替换了else,希望这会有所帮助。有没有更好的方法来做到这一点?我总是乐于改进。
    【解决方案2】:

    我在另一个文件(副本)中发现了我拥有的另一个文件(副本)

    :begin
    setlocal enableDelayedExpansion
    for...
    

    当我仔细查看这两个文件时,我注意到第二个和第三个单词开头的大写字母。我将其更改为顶部的代码 setlocal enableextensions enabledelayedexpansion 并将第一个字母更改为大写 setlocal enableExtensions enableDelayedExpansion 修复了所有内容,现在如果时间还不是下午 6:30 并且如果它在它之后,它会取消并退出6:30 然后它开始关机程序,它工作得很好!所以谢谢你的任何想法,但我自己回答了! :D

    希望这对未来的其他人也有帮助!

    【讨论】:

    • 嗯,不-抱歉。批处理关键字在很大程度上不区分大小写 - 它识别大小写的唯一位置是在 元变量(循环控制变量)的实例中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多