Board logo

标题: [系统相关] 检查用户闲置时间的批处理有什么问题?什么也不提示就是执行不正确。 [打印本页]

作者: songdianxue    时间: 2023-1-4 10:41     标题: 检查用户闲置时间的批处理有什么问题?什么也不提示就是执行不正确。

  1. @echo off
  2. :loop
  3. REM 检查当前用户的闲置时间
  4. for /f "tokens=2 delims=:" %%a in ('query user ^| findstr /i "idle time"') do set idle=%%a
  5. REM 将闲置时间字符串转换为数字
  6. for /f "tokens=1-2 delims=:" %%a in ("%idle%") do set /a idle=%%a*60+%%b
  7. REM 检查闲置时间是否大于 60 秒(1 分钟)
  8. if !idle! GTR 60 (
  9.   REM 显示 5 秒警告的倒计时
  10.   for /l %%i in (5, -1, 1) do (
  11.     echo 在 %%i 秒内锁定计算机...
  12.     timeout /t 1 > NUL
  13.   )
  14.   REM 锁定计算机
  15.   rundll32.exe user32.dll,LockWorkStation
  16. )
  17. REM 等待 1 秒后再次检查闲置时间
  18. timeout /T 1 > NUL
  19. goto loop
复制代码

作者: Batcher    时间: 2023-1-4 10:49

回复 1# songdianxue


要在代码里面使用 !idle! 这种变量,需要在第二行加上:
setlocal enabledelayedexpansion

如果仍有问题,请参考Q-01观察一下哪行代码在报错以及详细的报错信息:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA

如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: bat1152    时间: 2023-1-4 15:28

改为%idle%也可以。
作者: 77七    时间: 2023-1-4 16:48

  1. for /f "tokens=2 delims=:" %%a in ('query user ^| findstr /i "idle time"') do set idle=%%a
  2. for /f "tokens=1-2 delims=:" %%a in ("%idle%") do set /a idle=%%a*60+%%b
复制代码


这两句是矛盾的吧?每一句都用 : 分隔吗

可以试试每一行代码的结果,找下原因
  1. for /f "tokens=2 delims=:" %%a in ('query user ^| findstr /i "idle time"') do set idle=%%a
  2. echo %idle%
  3. pause
  4. for /f "tokens=1-2 delims=:" %%a in ("%idle%") do set /a idle=%%a*60+%%b
  5. echo %idle%
  6. pause
复制代码



另外 我的电脑 'query user' 的结果是这样的,版本差异吗...
USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
1234                   console             1  Active      none   2023/1/4 15:11

作者: songdianxue    时间: 2023-1-7 10:04

本帖最后由 songdianxue 于 2023-1-7 10:13 编辑

回复 2# Batcher


    谢谢大神的回复,但是还是不行。
  1. :loop
  2. REM 检查当前用户的闲置时间
  3. for /f "tokens=2 delims=:" %%a in ('query user ^| findstr /i "idle time"') do set idle=%%a
  4. REM 将闲置时间字符串转换为数字
  5. for /f "tokens=1-2 delims=:" %%a in ("%idle%") do set /a idle=%%a*60+%%b
  6. REM 检查闲置时间是否大于 60 秒(1 分钟)
  7. if %idle% GTR 60 (
  8.   REM 显示 5 秒警告的倒计时
  9.   for /l %%i in (5, -1, 1) do (
  10.     echo 在 %%i 秒内锁定计算机...
  11.     timeout /t 1
  12.   )
  13.   REM 锁定计算机
  14.   rundll32.exe user32.dll,LockWorkStation
  15. )
  16. REM 等待 1 秒后再次检查闲置时间
  17. timeout /T 1
  18. goto loop
复制代码
我又把代码改成这样,又出现了不应出现60的错误,请大神再看一下。[img]![]()[/img]
作者: songdianxue    时间: 2023-1-7 10:17

回复 3# bat1152


    改完后又出现,不应出现60的错误。
作者: 77七    时间: 2023-1-7 13:38

  1. @echo off
  2. :loop
  3. query user >>logQueryuser.txt
  4. timeout 35
  5. goto :loop
复制代码

运行这个,并“闲置”,70秒后关闭,把logQueryuser.txt中的三次结果发上来看看
作者: Batcher    时间: 2023-1-7 20:24

回复 5# songdianxue


先解决乱码问题,请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2