电脑连续三十分钟无人操作,自动锁屏,再把显示器和外设的供电一起断掉。需求听起来非常简单,但真正落地的时候,我踩过的坑比预期多不少。印象最深的是最初设计时差点把键盘鼠标也划进“外设断电”的范围——结果是显而易见的:锁屏后你回来,对着黑屏干瞪眼,连解锁都做不到,只能强制重启机器。这篇文章我会把整个项目从需求拆解、技术选型、脚本实现、实测定点电费到故障排查的过程完整讲一遍,给出可以直接抄作业的方案。适合谁看呢?负责办公室几十上百台电脑的运维人员,对自己电脑电费敏感的个人用户,还有给家里老人配电脑想省心的人,这部分思路都通用。1. 三十分钟空窗期,到底在烧多少电1.1 电脑待机并不是“没耗电”很多人有个认知误区:电脑只要没人操作,能耗就低得可以忽略。其实系统空闲只是让CPU降低了频率,显示器仍然在全亮度点亮,显卡、内存、主板、风扇都处于活跃待机状态。以最常见的办公台式机为例,包含一台24寸显示器的整机,在锁屏后屏幕还没关闭的空闲状态下,功耗稳定在60到90瓦非常常见。做个直观类比:一个普通白炽灯的功率在40瓦左右,等于一台无人操作的电脑屏幕亮着时,相当于同时开着两盏白炽灯,从早开到晚。如果一天里出现几次超过半小时的空窗,累积起来就是可观的一笔浪费。这一点在单台个人电脑上不明显,放大到几十上百台设备的办公室,一年的空耗电量足够做很多别的事情。1.2 锁屏不等于关屏,外设更是不容忽视系统自带的锁屏策略,默认情况下只是锁定会话,显示器并不会立刻关闭,而是继续按照Windows电源计划等待更长的时间才熄灭,有的机器甚至会因为选择了高性能电源计划而让屏幕永不关闭。外设这边的损耗更加隐蔽:USB音箱、耳机、摄像头、打印机这类带独立主控的设备,即使处于待机状态,每台也保持1到3瓦的消耗。五六个设备累积起来就是5到15瓦,相当于一盏节能灯常亮。所以这个标题把“锁屏”和“关闭外设电源”放在一起,确实抓准了两类主要的浪费源——安全上的锁屏需求和节能上的外设空耗,是同一个动作可以同步解决的两件事。2. 三条技术路线,优点和坑分别在哪2.1 路线A:Windows自带电源策略和屏保最简单粗暴的方案是用系统现成功能。在电源计划里设置“30分钟后关闭显示器”,再把屏保等待时间设成30分钟,开启“恢复时显示登录界面”。这套方案不装任何软件,系统级运行非常稳定,平时不用维护。缺点是能力边界很明显:只能控制显示器的开关,对USB外设完全无能为力;另外屏保的计时逻辑和键盘鼠标的“最后输入时间”不能完全画等号,后台有全屏视频或演示文稿播放时,屏保可能一直不触发,定时器重新计算。适合对节能要求不高的个人电脑作为兜底策略,但离标题里的“关闭外设电源”还有一段距离。2.2 路线B:任务计划程序加脚本,灵活度最高用PowerShell脚本调用系统API,读取真正的最后输入时间,超过1800秒就依次执行锁屏、关显示器、禁用指定的USB外设,然后通过任务计划程序注册为开机自启的后台任务。这是我最终采用的方案。它的核心价值在于“空闲判断是自己写的”,触发条件和动作全部可自定义:你可以只关显示器,也能选择关闭某个USB设备;日志齐全,出问题能追溯。第一次配置确实有门槛,需要懂一点Windows脚本和任务计划知识,但一次配置好之后,几乎不用再碰它。对于要用在多人办公环境的运维而言,这条路的可维护性最好。2.3 路线C:智能排插联动,物理断电最彻底如果外设是指打印机、音箱这种带独立供电插头的设备,最彻底的办法是物理断电。智能排插支持APP和定时控制,可以做到按时间统一断电。系统层面直接控制排插没有统一标准接口,一般要靠智能家居中枢做联动,或者干脆用排插自带的定时功能。物理断电的优点是没有待机功耗,归零就是归零;缺点是额外花钱,联动配置复杂,而且一旦误判,正在使用的设备突然断电可能导致数据丢失。所以我个人建议不要把它用在“30分钟无人操作”这种高频场景,更适合作为每天下班时间点的统一切断手段。2.4 方案对比一览方案空闲判定精度外设管理能力硬件成本配置复杂度推荐场景系统电源策略低仅显示器无极低个人电脑兜底任务计划+脚本高支持USB设备禁用无中等办公室批量部署智能排插联动中仅插电设备有较高下班统一断电3. 实操:手写一个空闲检测与断电守护脚本3.1 核心原理:如何准确感知“三十分钟无操作”Windows提供了GetLastInputInfo函数,能拿到系统里最后一次输入事件发生的时间,这里的输入包括键盘、鼠标、触摸板、触摸屏、远程桌面会话等。用当前系统运行时间减去这个时间戳,得到的就是真正意义上的空闲秒数。这个API精确到毫秒级,比屏保和任务计划自带的“空闲状态”条件可靠得多,因为计划任务的空闲条件还要求CPU占用率低等额外条件,很多时候并不能反映“人走开了”这个事实。我在脚本里通过PowerShell的Add-Type声明这个结构体和函数,再以一个循环定时读取,每30秒检查一次,一旦发现连续空闲时间超过1800秒,就进入锁屏与断电流程。整个方案的数据源头就是这一个数值,后面的动作全部围绕它展开。3.2 完整脚本:锁屏、关显示器、禁用外设下面这部分直接给一份可以修改使用的脚本,PowerShell 5.1及以上版本在Windows 10、Windows 11环境都能运行。整体逻辑是这样的:每次轮询获取空闲秒数。空闲时间达到1800秒后,调用rundll32.exe user32.dll,LockWorkStation锁定工作站。等待3秒,让锁屏动画稳定后,向系统发送关闭显示器的消息。再等待2秒,按名单禁用非必要的USB外设,比如USB音箱、独立摄像头、蓝牙设备。用户回来后,只要键盘和鼠标有输入,空闲时间会迅速降低,脚本自动把之前禁用的外设重新启用。所有步骤写入日志文件,方便后期排查。# NoOperationGuard.ps1 param( [int]$IdleLimitSeconds = 1800, [int]$PollIntervalSeconds = 30 ) $script:poweredDown = $false $logPath = "C:\ProgramData\NoOpGuard\guard.log" # 声明 Win32 API Add-Type -MemberDefinition @' [DllImport("user32.dll")] public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); public struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } '@ -Name LastInput -Namespace Guard -ErrorAction SilentlyContinue Add-Type -MemberDefinition @' [DllImport("user32.dll")] public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam); '@ -Name MonPwr -Namespace Guard -ErrorAction SilentlyContinue function Get-IdleSeconds { $plii = New-Object Guard.LASTINPUTINFO $plii.cbSize = [System.Runtime.InteropServices.Marshal]::SizeOf($plii) if ([Guard.LastInput]::GetLastInputInfo([ref]$plii)) { return [Math]::Round(([Environment]::TickCount - $plii.dwTime) / 1000.0) } return 0 } function Write-GuardLog($msg) { $ts = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $line = "[$ts] $msg" Write-Host $line if (-not (Test-Path (Split-Path $logPath))) { New-Item -ItemType Directory -Path (Split-Path $logPath) -Force | Out-Null } Add-Content -Path $logPath -Value $line } # 需要断电的外设名单,用 FriendlyName 模糊匹配 # 注意:绝对不要把键盘、鼠标、触摸板放入这个名单 $powerDownTargets = @( "*USB Audio*", "*Integrated Camera*", "*Bluetooth*" ) function Disable-PowerDownTargets { foreach ($name in $powerDownTargets) { Get-PnpDevice -FriendlyName $name -Status OK -ErrorAction SilentlyContinue | Disable-PnpDevice -Confirm:$false -ErrorAction SilentlyContinue } } function Enable-PowerDownTargets { foreach ($name in $powerDownTargets) { Get-PnpDevice -FriendlyName $name -ErrorAction SilentlyContinue | Enable-PnpDevice -Confirm:$false -ErrorAction SilentlyContinue } } function Start-LockAndPowerDown { Write-GuardLog "连续空闲达到阈值,开始锁屏并断电外设" # 锁定工作站 rundll32.exe user32.dll,LockWorkStation Start-Sleep -Seconds 3 # 发送关闭显示器指令 [Guard.MonPwr]::SendMessage(0xFFFF, 0x0112, 0xF170, 2) | Out-Null Write-GuardLog "显示器已关闭" Start-Sleep -Seconds 2 Disable-PowerDownTargets Write-GuardLog "非必要外设已断电" $script:poweredDown = $true } Write-GuardLog "守护脚本启动,空闲阈值:$IdleLimitSeconds 秒" while ($true) { $idleSec = Get-IdleSeconds Write-GuardLog "当前空闲时间:${idleSec}s" if ($script:poweredDown -and $idleSec -lt 30) { Write-GuardLog "检测到用户恢复操作,恢复外设电源" Enable-PowerDownTargets $script:poweredDown = $false } if ($idleSec -ge $IdleLimitSeconds -and -not $script:poweredDown) { Start-LockAndPowerDown } Start-Sleep -Seconds $PollIntervalSeconds }这里有一个必须说清楚的“红线”:名单里千万别把键盘和鼠标放进去。一旦锁屏后禁用掉输入设备,整个会话就没有任何解锁手段了,只能直接按电源键强制重启。我的做法是只把USB Audio这类明显不是输入外设的设备放进去,而且匹配用模糊关键字,宁可漏掉一个设备也不能错杀键鼠。必要的话,还可以改成在名单里写具体的PID和VID,只针对某个品牌型号的USB音频设备做精确禁用,减少误伤概率。3.3 配置任务计划,让脚本开机自启脚本写好后,要用任务计划程序才能稳定地在后台常驻。具体步骤如下。打开任务计划程序,在右侧点击创建任务。常规选项卡里,名称填NoOperationGuard,勾选“使用最高权限运行”。触发器选项卡,新建一个触发器,选择“登录时”,这样就保证每个用户登录后脚本自动启动。操作选项卡,新建操作,程序填写powershell.exe,参数填写:-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Scripts\NoOperationGuard.ps1"条件选项卡,把“只有在使用交流电源时才启动”这个勾去掉,否则笔记本插电以外的情况不会运行。设置选项卡,默认有一项“如果任务运行时间超过以下时间,停止任务”,默认是3天,这个对常驻脚本而言非常致命,因为超过3天脚本会被系统杀掉,之后就不再执行锁屏动作了。必须把这里改为“如果任务运行时间超过,停止任务”前的勾选去掉,或者把时间拉到一个很大的值。配置完成后,任务计划程序右下角能看到任务状态,右键运行一次做验证。日志文件里出现“守护脚本启动”和每30秒一条的“当前空闲时间”,说明脚本已经在正常工作了。3.4 配合系统层面做两层保险脚本只负责它自己的逻辑,系统电源计划也要做配套设置,避免冲突。打开控制面板的电源选项,在当前使用的电源计划里,把“关闭显示器”设为30分钟,“睡眠”设为从不。屏幕关闭这件事由脚本优先处理,系统自带的30分钟关闭作为兜底,万一脚本进程异常退出,机器最终还是会关屏,不至于屏幕通宵亮着。另外一个常见问题是鼠标轻微抖动导致屏幕被唤醒。到设备管理器里,找到鼠标和其他指针设备,在属性里打开电源管理选项卡,取消勾选“允许此设备唤醒计算机”。不取消的话,哪怕桌子轻轻震一下,鼠标的光学引擎送出一个信号,刚关闭的显示器又会亮起来,让“关闭显示器”形同虚设。键盘的这项设置同理,除非你明确需要按键盘唤醒屏幕。4. 功耗实测与电费细账4.1 用功耗仪才能拿到靠谱数据想要知道自己到底省了多少电,不能靠嘴估,要有一台功耗仪。我买的是一个计量插座,插在电脑电源线和插座之间,它能实时显示电压、电流、功率,还能统计累计电量。测量时有个小技巧:不要盯着瞬时跳动的数字记录,要把机器放在稳定状态下至少等两分钟,记录这段时间的平均功率。比如正常打字浏览网页属于动态状态,数字一直在70到120瓦之间波动,那就估一个中间值;锁屏后屏幕关闭,数字会稳定下来,这时候读到的值才有参考意义。4.2 三组状态的实测结果参考我在一台普通办公台式机上加装这套方案后记录了三组数据。第一组是系统空闲但显示器全亮,整机功耗约78瓦;第二组是执行脚本锁屏并且关闭显示器之后,整机功耗稳定在31瓦;第三组是正常办公打字,动态功耗在90到110瓦之间。第二组和第一组之间相差47瓦,这47瓦就是每次空闲触发后每小时省下来的电量。换一台带独立显卡的机器,差距会更明显。独显主机即使在桌面空闲状态下,显卡的频率控制不如办公机那么激进,亮屏空闲功耗能做到120瓦左右,锁屏加关屏后降到55瓦左右,差额达到65瓦。笔记本外接显示器的情况相对小一些,亮屏空闲约45瓦,关闭屏幕后约15瓦,差30瓦。功耗大小和硬件配置关系很大,但逻辑是一样的:屏幕是最大的变量,锁屏节能的关键是先灭屏幕,外设那几瓦只能算是锦上添花。4.3 一年能省一个什么量级的钱以单台办公台式机、差额47瓦来估算。假设每天有六次超过30分钟的空闲,而且每次人走开的时长在45分钟左右,那么脚本在第30分钟触发后,每次有效省电时间是15分钟。一天的省电量就是47瓦乘以0.25小时,再乘以6次,约70瓦时,一年按照250个工作日算是17.6千瓦时。如果每天有一次长达两小时的空闲时段,一次就能省1.5小时乘以47瓦,约70瓦时,一年同样是十几千瓦时的量级。这些数字单看一台机器确实不大,但放到五十台电脑的办公环境里,一年就是近千千瓦时。按一度电一元估算,相当于一年省下上千元电费,而且这还只是“空闲时段自动关屏”一项带来的收益。实际部署时还会带来一个额外好处:锁屏动作让电脑进入需要密码才能解锁的状态,降低了敏感信息被路过的人看到的概率,这部分安全价值不太好用钱衡量,但对很多公司来说可能比电费更重要。5. 常见问题与排查实操速查5.1 日志里空闲时间一直不涨脚本输出的日志里,如果当前空闲时间每次都从0秒重新开始,或者长时间停在个位数,说明系统一直在收到输入信号,连三秒钟的完整空闲都没有。常见原因是后台有全屏视频在播放,或者某个远程控制软件会话处于活动状态。网页里的视频也算输入活动吗?严格来说,网页视频播放不会产生输入事件,但浏览器可能会通过鼠标hover或脚本自动点击模拟输入,具体表现因软件而异。排查方法是临时关闭可疑的后台软件,每关一个就观察30秒,看日志里的空闲时间是否开始正常往上累加。5.2 显示器刚关了又被唤醒这个现象出现频率最高。根本原因是某些设备具备“允许唤醒计算机”的权利,最常见的就是鼠标。在电源管理里关掉鼠标的唤醒权限后,基本能解决。如果还是频繁唤醒,去BIOS里看USB唤醒设置和ErP设置,把USB键鼠唤醒关掉或者把ErP设为Enabled,从硬件层面禁止USB信号唤醒系统。显示器本身的DPMS协议也可能在收到信号后自动点亮,这时候需要检查显卡驱动面板里的显示器电源管理选项,有些显卡驱动会单独控制省电模式,与Windows系统设置并存。5.3 键鼠被误纳入名单,解锁不了了这个问题发生一次就够记忆深刻。我的自救经验是:提前准备另一套有线键鼠,平时不用,躺在抽屉里。一旦发生误禁用键鼠的情况,把这套键鼠插在主板的另一个USB接口上,等Windows完成设备识别后,用这第二套键鼠打开设备管理器,找到被禁用的设备重新启用,或者直接重启机器,禁用状态在重启后会解除。如果是台服务器或者放在公共机房里的机器,更稳妥的办法是在禁用名单里用设备的实例ID做精确匹配,而不是用FriendlyName模糊匹配,最大程度减少误伤概率。5.4 任务跑了一段时间后悄无声息地停了我遇到的多数原因是任务计划程序里那个“如果任务运行超过,停止任务”的默认设置。Windows为了不让任务无限运行,默认设置了三天超时,常驻型脚本超过这个时间就会被强制终止。按3.3节说的,把超时限制去掉后,问题就解决了。另外Windows大版本更新后,电源计划会被重置为默认值,丢失之前的自定义配置,这时系统自带的关屏时间又回到默认,和脚本阈值不匹配,需要重新设置一次。建议把这些设置变更整理成一个文档,每次Windows更新后再花两分钟检查一遍。5.5 问题速查表症状可能原因解决动作空闲时间不累加后台软件模拟输入或全屏播放逐个关闭后台软件排查显示器反复点亮鼠标唤醒权限开启关闭设备电源管理的唤醒选项键鼠也被断电名单匹配范围过大改用设备实例ID精确匹配脚本几天后失效任务计划默认超时去掉超时限制系统更新后不触发了电源计划被重置重新配置电源选项并检查任务状态6. 最后一点个人体会整套方案做完后,我最大的体会是自动化节能设计要兼顾安全边界,而不是参数越激进越好,效果也不是越狠越好。脚本的逻辑很简单,真正复杂的是把各种边缘情况想清楚:键鼠不能断,用户回来时要自动恢复,日志要能追溯到每一次动作,系统更新后要重新检查。如果你打算在公司电脑上批量部署,强烈建议先在自己的机器上连续跑满一周,把日志全部导出来看一遍,确认触发时点都对,再考虑推广。后续如果想进一步节能,可以在这个基础上扩展:工作日下午六点之后,检测到空闲超过三小时就直接休眠;或者把日志里的功耗数据接入监控面板,用数据说服管理层更新一批更节能的设备。这些都是一步步迭代出来的事,重要的是先把自动锁屏和关闭外设电源这第一步扎实落地。
电脑连续三十分钟无人操作,自动锁屏,再把显示器和外设的供电一起断掉。需求听起来非常简单,但真正落地的时候,我踩过的坑比预期多不少。印象最深的是最初设计时差点把键盘鼠标也划进“外设断电”的范围——结果是显而易见的:锁屏后你回来,对着黑屏干瞪眼,连解锁都做不到,只能强制重启机器。这篇文章我会把整个项目从需求拆解、技术选型、脚本实现、实测定点电费到故障排查的过程完整讲一遍,给出可以直接抄作业的方案。适合谁看呢?负责办公室几十上百台电脑的运维人员,对自己电脑电费敏感的个人用户,还有给家里老人配电脑想省心的人,这部分思路都通用。1. 三十分钟空窗期,到底在烧多少电1.1 电脑待机并不是“没耗电”很多人有个认知误区:电脑只要没人操作,能耗就低得可以忽略。其实系统空闲只是让CPU降低了频率,显示器仍然在全亮度点亮,显卡、内存、主板、风扇都处于活跃待机状态。以最常见的办公台式机为例,包含一台24寸显示器的整机,在锁屏后屏幕还没关闭的空闲状态下,功耗稳定在60到90瓦非常常见。做个直观类比:一个普通白炽灯的功率在40瓦左右,等于一台无人操作的电脑屏幕亮着时,相当于同时开着两盏白炽灯,从早开到晚。如果一天里出现几次超过半小时的空窗,累积起来就是可观的一笔浪费。这一点在单台个人电脑上不明显,放大到几十上百台设备的办公室,一年的空耗电量足够做很多别的事情。1.2 锁屏不等于关屏,外设更是不容忽视系统自带的锁屏策略,默认情况下只是锁定会话,显示器并不会立刻关闭,而是继续按照Windows电源计划等待更长的时间才熄灭,有的机器甚至会因为选择了高性能电源计划而让屏幕永不关闭。外设这边的损耗更加隐蔽:USB音箱、耳机、摄像头、打印机这类带独立主控的设备,即使处于待机状态,每台也保持1到3瓦的消耗。五六个设备累积起来就是5到15瓦,相当于一盏节能灯常亮。所以这个标题把“锁屏”和“关闭外设电源”放在一起,确实抓准了两类主要的浪费源——安全上的锁屏需求和节能上的外设空耗,是同一个动作可以同步解决的两件事。2. 三条技术路线,优点和坑分别在哪2.1 路线A:Windows自带电源策略和屏保最简单粗暴的方案是用系统现成功能。在电源计划里设置“30分钟后关闭显示器”,再把屏保等待时间设成30分钟,开启“恢复时显示登录界面”。这套方案不装任何软件,系统级运行非常稳定,平时不用维护。缺点是能力边界很明显:只能控制显示器的开关,对USB外设完全无能为力;另外屏保的计时逻辑和键盘鼠标的“最后输入时间”不能完全画等号,后台有全屏视频或演示文稿播放时,屏保可能一直不触发,定时器重新计算。适合对节能要求不高的个人电脑作为兜底策略,但离标题里的“关闭外设电源”还有一段距离。2.2 路线B:任务计划程序加脚本,灵活度最高用PowerShell脚本调用系统API,读取真正的最后输入时间,超过1800秒就依次执行锁屏、关显示器、禁用指定的USB外设,然后通过任务计划程序注册为开机自启的后台任务。这是我最终采用的方案。它的核心价值在于“空闲判断是自己写的”,触发条件和动作全部可自定义:你可以只关显示器,也能选择关闭某个USB设备;日志齐全,出问题能追溯。第一次配置确实有门槛,需要懂一点Windows脚本和任务计划知识,但一次配置好之后,几乎不用再碰它。对于要用在多人办公环境的运维而言,这条路的可维护性最好。2.3 路线C:智能排插联动,物理断电最彻底如果外设是指打印机、音箱这种带独立供电插头的设备,最彻底的办法是物理断电。智能排插支持APP和定时控制,可以做到按时间统一断电。系统层面直接控制排插没有统一标准接口,一般要靠智能家居中枢做联动,或者干脆用排插自带的定时功能。物理断电的优点是没有待机功耗,归零就是归零;缺点是额外花钱,联动配置复杂,而且一旦误判,正在使用的设备突然断电可能导致数据丢失。所以我个人建议不要把它用在“30分钟无人操作”这种高频场景,更适合作为每天下班时间点的统一切断手段。2.4 方案对比一览方案空闲判定精度外设管理能力硬件成本配置复杂度推荐场景系统电源策略低仅显示器无极低个人电脑兜底任务计划+脚本高支持USB设备禁用无中等办公室批量部署智能排插联动中仅插电设备有较高下班统一断电3. 实操:手写一个空闲检测与断电守护脚本3.1 核心原理:如何准确感知“三十分钟无操作”Windows提供了GetLastInputInfo函数,能拿到系统里最后一次输入事件发生的时间,这里的输入包括键盘、鼠标、触摸板、触摸屏、远程桌面会话等。用当前系统运行时间减去这个时间戳,得到的就是真正意义上的空闲秒数。这个API精确到毫秒级,比屏保和任务计划自带的“空闲状态”条件可靠得多,因为计划任务的空闲条件还要求CPU占用率低等额外条件,很多时候并不能反映“人走开了”这个事实。我在脚本里通过PowerShell的Add-Type声明这个结构体和函数,再以一个循环定时读取,每30秒检查一次,一旦发现连续空闲时间超过1800秒,就进入锁屏与断电流程。整个方案的数据源头就是这一个数值,后面的动作全部围绕它展开。3.2 完整脚本:锁屏、关显示器、禁用外设下面这部分直接给一份可以修改使用的脚本,PowerShell 5.1及以上版本在Windows 10、Windows 11环境都能运行。整体逻辑是这样的:每次轮询获取空闲秒数。空闲时间达到1800秒后,调用rundll32.exe user32.dll,LockWorkStation锁定工作站。等待3秒,让锁屏动画稳定后,向系统发送关闭显示器的消息。再等待2秒,按名单禁用非必要的USB外设,比如USB音箱、独立摄像头、蓝牙设备。用户回来后,只要键盘和鼠标有输入,空闲时间会迅速降低,脚本自动把之前禁用的外设重新启用。所有步骤写入日志文件,方便后期排查。# NoOperationGuard.ps1 param( [int]$IdleLimitSeconds = 1800, [int]$PollIntervalSeconds = 30 ) $script:poweredDown = $false $logPath = "C:\ProgramData\NoOpGuard\guard.log" # 声明 Win32 API Add-Type -MemberDefinition @' [DllImport("user32.dll")] public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); public struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } '@ -Name LastInput -Namespace Guard -ErrorAction SilentlyContinue Add-Type -MemberDefinition @' [DllImport("user32.dll")] public static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam); '@ -Name MonPwr -Namespace Guard -ErrorAction SilentlyContinue function Get-IdleSeconds { $plii = New-Object Guard.LASTINPUTINFO $plii.cbSize = [System.Runtime.InteropServices.Marshal]::SizeOf($plii) if ([Guard.LastInput]::GetLastInputInfo([ref]$plii)) { return [Math]::Round(([Environment]::TickCount - $plii.dwTime) / 1000.0) } return 0 } function Write-GuardLog($msg) { $ts = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $line = "[$ts] $msg" Write-Host $line if (-not (Test-Path (Split-Path $logPath))) { New-Item -ItemType Directory -Path (Split-Path $logPath) -Force | Out-Null } Add-Content -Path $logPath -Value $line } # 需要断电的外设名单,用 FriendlyName 模糊匹配 # 注意:绝对不要把键盘、鼠标、触摸板放入这个名单 $powerDownTargets = @( "*USB Audio*", "*Integrated Camera*", "*Bluetooth*" ) function Disable-PowerDownTargets { foreach ($name in $powerDownTargets) { Get-PnpDevice -FriendlyName $name -Status OK -ErrorAction SilentlyContinue | Disable-PnpDevice -Confirm:$false -ErrorAction SilentlyContinue } } function Enable-PowerDownTargets { foreach ($name in $powerDownTargets) { Get-PnpDevice -FriendlyName $name -ErrorAction SilentlyContinue | Enable-PnpDevice -Confirm:$false -ErrorAction SilentlyContinue } } function Start-LockAndPowerDown { Write-GuardLog "连续空闲达到阈值,开始锁屏并断电外设" # 锁定工作站 rundll32.exe user32.dll,LockWorkStation Start-Sleep -Seconds 3 # 发送关闭显示器指令 [Guard.MonPwr]::SendMessage(0xFFFF, 0x0112, 0xF170, 2) | Out-Null Write-GuardLog "显示器已关闭" Start-Sleep -Seconds 2 Disable-PowerDownTargets Write-GuardLog "非必要外设已断电" $script:poweredDown = $true } Write-GuardLog "守护脚本启动,空闲阈值:$IdleLimitSeconds 秒" while ($true) { $idleSec = Get-IdleSeconds Write-GuardLog "当前空闲时间:${idleSec}s" if ($script:poweredDown -and $idleSec -lt 30) { Write-GuardLog "检测到用户恢复操作,恢复外设电源" Enable-PowerDownTargets $script:poweredDown = $false } if ($idleSec -ge $IdleLimitSeconds -and -not $script:poweredDown) { Start-LockAndPowerDown } Start-Sleep -Seconds $PollIntervalSeconds }这里有一个必须说清楚的“红线”:名单里千万别把键盘和鼠标放进去。一旦锁屏后禁用掉输入设备,整个会话就没有任何解锁手段了,只能直接按电源键强制重启。我的做法是只把USB Audio这类明显不是输入外设的设备放进去,而且匹配用模糊关键字,宁可漏掉一个设备也不能错杀键鼠。必要的话,还可以改成在名单里写具体的PID和VID,只针对某个品牌型号的USB音频设备做精确禁用,减少误伤概率。3.3 配置任务计划,让脚本开机自启脚本写好后,要用任务计划程序才能稳定地在后台常驻。具体步骤如下。打开任务计划程序,在右侧点击创建任务。常规选项卡里,名称填NoOperationGuard,勾选“使用最高权限运行”。触发器选项卡,新建一个触发器,选择“登录时”,这样就保证每个用户登录后脚本自动启动。操作选项卡,新建操作,程序填写powershell.exe,参数填写:-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Scripts\NoOperationGuard.ps1"条件选项卡,把“只有在使用交流电源时才启动”这个勾去掉,否则笔记本插电以外的情况不会运行。设置选项卡,默认有一项“如果任务运行时间超过以下时间,停止任务”,默认是3天,这个对常驻脚本而言非常致命,因为超过3天脚本会被系统杀掉,之后就不再执行锁屏动作了。必须把这里改为“如果任务运行时间超过,停止任务”前的勾选去掉,或者把时间拉到一个很大的值。配置完成后,任务计划程序右下角能看到任务状态,右键运行一次做验证。日志文件里出现“守护脚本启动”和每30秒一条的“当前空闲时间”,说明脚本已经在正常工作了。3.4 配合系统层面做两层保险脚本只负责它自己的逻辑,系统电源计划也要做配套设置,避免冲突。打开控制面板的电源选项,在当前使用的电源计划里,把“关闭显示器”设为30分钟,“睡眠”设为从不。屏幕关闭这件事由脚本优先处理,系统自带的30分钟关闭作为兜底,万一脚本进程异常退出,机器最终还是会关屏,不至于屏幕通宵亮着。另外一个常见问题是鼠标轻微抖动导致屏幕被唤醒。到设备管理器里,找到鼠标和其他指针设备,在属性里打开电源管理选项卡,取消勾选“允许此设备唤醒计算机”。不取消的话,哪怕桌子轻轻震一下,鼠标的光学引擎送出一个信号,刚关闭的显示器又会亮起来,让“关闭显示器”形同虚设。键盘的这项设置同理,除非你明确需要按键盘唤醒屏幕。4. 功耗实测与电费细账4.1 用功耗仪才能拿到靠谱数据想要知道自己到底省了多少电,不能靠嘴估,要有一台功耗仪。我买的是一个计量插座,插在电脑电源线和插座之间,它能实时显示电压、电流、功率,还能统计累计电量。测量时有个小技巧:不要盯着瞬时跳动的数字记录,要把机器放在稳定状态下至少等两分钟,记录这段时间的平均功率。比如正常打字浏览网页属于动态状态,数字一直在70到120瓦之间波动,那就估一个中间值;锁屏后屏幕关闭,数字会稳定下来,这时候读到的值才有参考意义。4.2 三组状态的实测结果参考我在一台普通办公台式机上加装这套方案后记录了三组数据。第一组是系统空闲但显示器全亮,整机功耗约78瓦;第二组是执行脚本锁屏并且关闭显示器之后,整机功耗稳定在31瓦;第三组是正常办公打字,动态功耗在90到110瓦之间。第二组和第一组之间相差47瓦,这47瓦就是每次空闲触发后每小时省下来的电量。换一台带独立显卡的机器,差距会更明显。独显主机即使在桌面空闲状态下,显卡的频率控制不如办公机那么激进,亮屏空闲功耗能做到120瓦左右,锁屏加关屏后降到55瓦左右,差额达到65瓦。笔记本外接显示器的情况相对小一些,亮屏空闲约45瓦,关闭屏幕后约15瓦,差30瓦。功耗大小和硬件配置关系很大,但逻辑是一样的:屏幕是最大的变量,锁屏节能的关键是先灭屏幕,外设那几瓦只能算是锦上添花。4.3 一年能省一个什么量级的钱以单台办公台式机、差额47瓦来估算。假设每天有六次超过30分钟的空闲,而且每次人走开的时长在45分钟左右,那么脚本在第30分钟触发后,每次有效省电时间是15分钟。一天的省电量就是47瓦乘以0.25小时,再乘以6次,约70瓦时,一年按照250个工作日算是17.6千瓦时。如果每天有一次长达两小时的空闲时段,一次就能省1.5小时乘以47瓦,约70瓦时,一年同样是十几千瓦时的量级。这些数字单看一台机器确实不大,但放到五十台电脑的办公环境里,一年就是近千千瓦时。按一度电一元估算,相当于一年省下上千元电费,而且这还只是“空闲时段自动关屏”一项带来的收益。实际部署时还会带来一个额外好处:锁屏动作让电脑进入需要密码才能解锁的状态,降低了敏感信息被路过的人看到的概率,这部分安全价值不太好用钱衡量,但对很多公司来说可能比电费更重要。5. 常见问题与排查实操速查5.1 日志里空闲时间一直不涨脚本输出的日志里,如果当前空闲时间每次都从0秒重新开始,或者长时间停在个位数,说明系统一直在收到输入信号,连三秒钟的完整空闲都没有。常见原因是后台有全屏视频在播放,或者某个远程控制软件会话处于活动状态。网页里的视频也算输入活动吗?严格来说,网页视频播放不会产生输入事件,但浏览器可能会通过鼠标hover或脚本自动点击模拟输入,具体表现因软件而异。排查方法是临时关闭可疑的后台软件,每关一个就观察30秒,看日志里的空闲时间是否开始正常往上累加。5.2 显示器刚关了又被唤醒这个现象出现频率最高。根本原因是某些设备具备“允许唤醒计算机”的权利,最常见的就是鼠标。在电源管理里关掉鼠标的唤醒权限后,基本能解决。如果还是频繁唤醒,去BIOS里看USB唤醒设置和ErP设置,把USB键鼠唤醒关掉或者把ErP设为Enabled,从硬件层面禁止USB信号唤醒系统。显示器本身的DPMS协议也可能在收到信号后自动点亮,这时候需要检查显卡驱动面板里的显示器电源管理选项,有些显卡驱动会单独控制省电模式,与Windows系统设置并存。5.3 键鼠被误纳入名单,解锁不了了这个问题发生一次就够记忆深刻。我的自救经验是:提前准备另一套有线键鼠,平时不用,躺在抽屉里。一旦发生误禁用键鼠的情况,把这套键鼠插在主板的另一个USB接口上,等Windows完成设备识别后,用这第二套键鼠打开设备管理器,找到被禁用的设备重新启用,或者直接重启机器,禁用状态在重启后会解除。如果是台服务器或者放在公共机房里的机器,更稳妥的办法是在禁用名单里用设备的实例ID做精确匹配,而不是用FriendlyName模糊匹配,最大程度减少误伤概率。5.4 任务跑了一段时间后悄无声息地停了我遇到的多数原因是任务计划程序里那个“如果任务运行超过,停止任务”的默认设置。Windows为了不让任务无限运行,默认设置了三天超时,常驻型脚本超过这个时间就会被强制终止。按3.3节说的,把超时限制去掉后,问题就解决了。另外Windows大版本更新后,电源计划会被重置为默认值,丢失之前的自定义配置,这时系统自带的关屏时间又回到默认,和脚本阈值不匹配,需要重新设置一次。建议把这些设置变更整理成一个文档,每次Windows更新后再花两分钟检查一遍。5.5 问题速查表症状可能原因解决动作空闲时间不累加后台软件模拟输入或全屏播放逐个关闭后台软件排查显示器反复点亮鼠标唤醒权限开启关闭设备电源管理的唤醒选项键鼠也被断电名单匹配范围过大改用设备实例ID精确匹配脚本几天后失效任务计划默认超时去掉超时限制系统更新后不触发了电源计划被重置重新配置电源选项并检查任务状态6. 最后一点个人体会整套方案做完后,我最大的体会是自动化节能设计要兼顾安全边界,而不是参数越激进越好,效果也不是越狠越好。脚本的逻辑很简单,真正复杂的是把各种边缘情况想清楚:键鼠不能断,用户回来时要自动恢复,日志要能追溯到每一次动作,系统更新后要重新检查。如果你打算在公司电脑上批量部署,强烈建议先在自己的机器上连续跑满一周,把日志全部导出来看一遍,确认触发时点都对,再考虑推广。后续如果想进一步节能,可以在这个基础上扩展:工作日下午六点之后,检测到空闲超过三小时就直接休眠;或者把日志里的功耗数据接入监控面板,用数据说服管理层更新一批更节能的设备。这些都是一步步迭代出来的事,重要的是先把自动锁屏和关闭外设电源这第一步扎实落地。