我的电脑最近半年一直在跑一个看起来很土的需求:连续30分钟没有任何操作,就自动锁定屏幕,同时把显示器、音箱这些外设的电源一起断掉,实现节能。这个需求听起来就是电源选项里改几个下拉框的事,真正做下来才发现,锁屏只是个开始,外设断电才是大头。今天把这套从需求拆解、方案选型、脚本实现到踩坑记录完整写一遍,想直接抄作业的可以跳到第三节,想搞明白原理的从头看,普通用户和爱折腾的朋友应该都能在文章里找到自己想要的东西。
1. 需求拆解:一句标题背后的三个隐藏问题
一句“三十分钟无操作自动锁屏并关闭外设电源”看着简单,里面至少藏着三个需要先想清楚的问题:系统怎么判定“无操作”、外设电源到底怎么关、节能到底能省多少。这三个问题不解决,做出来的方案大概率是半吊子。
1.1 “三十分钟无操作”到底是谁说了算
先说“无操作”这个概念。很多人第一反应是鼠标键盘不动就算无操作,但系统层面的“空闲”判断比我们想象的更复杂。Windows内部有一个全局输入计时器,键盘、鼠标、触摸屏、手写笔、游戏手柄的输入都会刷新这个时间戳。用API去读这个时间戳,才能精确知道用户最后一次物理操作是什么时候。
麻烦的地方在于,播放视频、后台下载、程序渲染这些事,并不是“操作”。你正在看一部两个小时的电影,手没动过鼠标,但从系统角度看,你就是“空闲”了。所以脚本方案里必须能识别这种例外场景,否则看电影看到一半电脑锁屏,体验会很差。这个问题放到后面“常见问题”里详细说。
另外还有一类输入容易被忽略:无线鼠标的接收器偶尔会因为桌面震动、电池电压波动而产生微小信号,系统会把这当成一次“操作”,导致空闲计时永远走不到30分钟。这类问题不是脚本逻辑错,而是外界物理干扰,排查起来特别容易怀疑人生。
1.2 “锁定屏幕”容易,“关闭外设电源”才是重头戏
锁定屏幕本身没有任何技术门槛,Windows自带锁屏快捷键、动态锁、电源计划都能做。真正麻烦的是“关闭外设电源”这半句话。
外设是什么?显示器、音箱、打印机、扫描仪、USB充电线、扩展坞、外接硬盘盒、游戏手柄充电座,这些东西加在一起,待机功耗并不小。显示器待机时面板关闭,但电源板和指示灯还在工作,通常还有0.5瓦到3瓦的消耗;音箱待机普遍在5瓦到15瓦;打印机的待机能耗甚至能到10瓦以上;一个带变压器的USB集线器,插着几根充电线,空载损耗也有两三瓦。
麻烦点在于,操作系统只能控制显示器关闭,控制不了插座断电。USB口的供电在锁屏后依然存在,音箱依然通着电,打印机依然亮着灯。想要真正切断外设电源,要么用智能插座,要么用带物理开关的排插或USB Hub。这就从纯软件问题变成了“软件+硬件”的联动问题,复杂度直接上一个台阶。
1.3 节能到底能省多少,值不值得折腾
先算一笔保守的账。假设每天有2小时电脑处于锁屏后屏幕还亮着、音箱还在通电的“假待机”状态,显示器60瓦、音箱10瓦、其他外设10瓦,合计80瓦。2小时就是0.16度电,一年365天约58度电。按居民电价0.5到0.6元算,一年能省三十元左右。
单看电费确实不多,但节能这件事不能只算电费。长期亮着的显示器会加速背光老化,打印机长期通电会增加吸潮和电路老化的风险,音箱通电时即使不出声也会持续发热,这些硬件损耗才是大头。而且锁屏本身就是安全需求,防的就是人离开后有人动你的电脑。所以这套方案的核心价值排序应该是:安全锁屏第一,硬件保护第二,省电费排最后。
2. 方案选型:五条路的对比与取舍
需求清楚了,接下来就是对方案。市面上能实现“空闲锁屏+外设断电”的路径有好几条,每条都有自己的边界条件。我最初也走过弯路,先把几条路都列出来,说清楚各自的优劣势,最后给出我认为最稳的组合。
2.1 系统自带方案:先认清边界
最容易想到的是Windows自带的电源计划和锁屏功能。在“设置-系统-电源”里把“接通电源后经过以下时间关闭屏幕”调成15分钟,再把锁屏等待时间调成30分钟,看起来就行了。
这套方案的优点是完全原生、零成本、不折腾。但缺点也很明显:第一,系统自带的空闲判定并不完全受控,播放视频时经常不进入空闲状态,可你人明明没在操作;第二,它只能关显示器,管不了插座上的音箱和打印机;第三,所谓“锁屏等待时间”在不同版本系统里的位置不一样,有的藏在电源选项高级设置里,普通用户根本找不到。
还有一个隐藏问题:如果只依赖电源计划的“关闭显示器”,那么屏幕关闭后,只要鼠标被碰一下,屏幕就会重新亮起,空闲计时也随之重置。在办公室环境里桌子一震、鼠标一晃,屏幕反复亮起,锁屏计划就被无限推迟。所以系统自带方案只能做兜底,做不了主角。
2.2 计划任务加脚本:最灵活的“软件锁”
既然系统自带方案不可靠,就需要自己写一个精确的空闲检测脚本。核心思路是用PowerShell调用系统的GetLastInputInfo API,读取距离用户最后一次物理输入已经过去的时间,一旦超过30分钟就触发锁屏。
这种方案的好处是,空闲判定完全由你说了算。可以设置30分钟、10分钟,甚至5分钟;可以在锁屏前弹窗提醒;可以跳过指定的进程;可以在锁屏的同时调用智能插座API,把外设电源一起断掉。配合计划任务,还能实现开机自启、失败自动重启。对于愿意折腾的人来说,这是最可控的方案。
这套方案的缺点是门槛略高,需要懂一点PowerShell和任务计划程序的操作。不过不用担心,后面我会把完整脚本和每一步设置都写出来,照着抄就能用。
2.3 硬件断电:智能插座与带开关的USB Hub
软件能把系统锁住、把屏幕关掉,但控制不了市电。这时候就需要硬件介入。
最通用的是智能插座,显示器、音箱、打印机这类大功率外设都可以接到上面。智能插座如果能连家门局域网,锁屏脚本就可以通过HTTP请求直接把它关掉;如果只支持手机App控制,就没法全自动,退而求其次用它的定时功能或者手动关。
另一类是带独立开关的USB Hub或排插。键盘鼠标以外的USB外设,比如充电线、读卡器、USB声卡、Hub供电的扩展坞,都可以集中接到一个带开关的Hub上,人走的时候按一下开关就把整组外设断电。这种方案成本很低,而且直观可控,唯一的问题是得养成手动关的习惯。
需要特别强调的是,键盘鼠标一定不要接在受控断电的设备上。否则锁屏断电后,你回来连键盘都用不了,只能用电源键强制重启,那就非常尴尬了。键鼠必须直连电脑主板USB口,或者接在不受控的Hub上。
2.4 第三方工具:能用但别迷信
市面上确实有不少“空闲锁屏”类的绿色工具,功能看起来比脚本全面,有的还能直接控制USB口断电。我用过其中几款,印象是:安装包越小的越容易消失,功能越全的越喜欢捆绑,还有一些干脆是收费软件试用版。
不是说所有工具都不行,而是这类工具往往需要常驻后台、监听全局输入,本身就容易触发杀毒软件的敏感模块。再加上闭源代码你没法确认它有没有偷偷上传数据,对于要长期挂在电脑上的东西,我倾向于自己能看得懂的脚本方案。如果不愿意碰代码,用系统自带方案加上手动关Hub,也已经能解决大部分问题。
2.5 我的推荐组合
综合下来,我最推荐的组合是:软件层用PowerShell精确检测空闲,到时间后锁屏并关闭显示器,如果有支持局域网API的智能插座就顺手把外设电源一起断掉;硬件层用带开关的USB Hub管理充电线和零散外设,键鼠直连主机不受控。先让锁屏和显示器关闭跑稳定,再逐步加入外设断电的联动,不要一开始就指望一步到位。
这套组合的核心理念是“软件管系统,硬件管电源,各司其职”。脚本只负责判断空闲和锁屏,不要试图用软件去模拟开关插座;插座只负责断电,不要指望它检测系统状态。边界清晰了,问题就少了一半。
3. 核心实现:一套可直接抄走的配置
方案定下来,剩下的就是动手。这一节我会把从空闲检测脚本到显示器关闭、外设断电的完整步骤一步步写出来,每段代码都会解释它在干什么,方便你根据自己情况调整。
3.1 第一步:精确的空闲检测脚本
下面是核心脚本,我把注释写在了关键位置。它的作用就是每5秒检查一次系统空闲时间,一旦超过30分钟就立即锁屏。
Add-Type @" using System; using System.Runtime.InteropServices; public class UserIdleHelper { [DllImport("user32.dll")] public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); [StructLayout(LayoutKind.Sequential)] public struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } [DllImport("user32.dll")] public static extern bool LockWorkStation(); } "@ $timeoutMinutes = 30 $threshold = $timeoutMinutes * 60 * 1000 while ($true) { $state = New-Object UserIdleHelper+LASTINPUTINFO $state.cbSize = [System.Runtime.InteropServices.Marshal]::SizeOf($state) [UserIdleHelper]::GetLastInputInfo([ref]$state) | Out-Null $idleMs = [Environment]::TickCount - $state.dwTime if ($idleMs -lt 0) { $idleMs = 0 } if ($idleMs -ge $threshold) { [UserIdleHelper]::LockWorkStation() | Out-Null break } Start-Sleep -Seconds 5 }这里解释几个关键点。GetLastInputInfo是Windows提供的API,它会返回一个时间戳,记录用户最后一次物理输入发生在什么时候。[Environment]::TickCount是系统启动以来经过的毫秒数,两者相减就是当前空闲了多少毫秒。
判断循环里的Start-Sleep -Seconds 5是必要的,不然CPU会被脚本吃满。每5秒查一次,对于30分钟的超时判断来说完全够用,CPU占用可以忽略不计。
如果你电脑常年不关机,需要注意[Environment]::TickCount这个值是32位整数,系统运行超过49.7天就会溢出回绕,极端情况下可能导致空闲时间计算错误。稳妥的做法是改用GetTickCount64这个64位API,不过对于绝大多数每天开关机的电脑来说,这个隐患不实际,我就不把脚本写复杂了。
3.2 第二步:要不要加“即将锁屏”的倒计时提醒
我一开始做的版本是到点直接锁屏,后来用自己电脑做测试时被坑过一次:正在写一个没保存的文档,电脑突然锁屏,回来解锁后虽然文档还在,但一些未提交的临时状态丢了。从那以后我就建议,脚本里加一个提前几分钟的提醒会更安全。
做法很简单:把30分钟拆成两个阈值,空闲到25分钟时先弹一条提示,空闲到30分钟再锁屏。弹提示可以用Windows自带的MsgBox,也可以用系统通知。因为PowerShell脚本本身常驻,弹窗会阻塞脚本,所以要异步启动一个新的提示进程,不能让提示窗口卡住主循环。
不过我最终没有把提醒逻辑写进正式脚本,原因有两个:一是我发现自己离开电脑时根本不会盯着屏幕,提醒弹不弹都无所谓;二是多一个弹窗就多一个和杀毒软件打交道的风险。如果你经常担心锁屏打断工作,建议自己加上提醒,但要做好“人走了屏幕还会亮5分钟”的心理准备,因为这5分钟内屏幕亮度会持续耗电。
3.3 第三步:锁屏的同时直接关闭显示器
大部人以为锁屏后屏幕会自动熄灭,其实不一定。锁屏只是进入了登录界面,显示器依然亮着,密码框和壁纸背景都还亮着呢。如果只是依赖系统电源计划里的“关闭显示器”,前面说过会有鼠标微动导致计时重置的坑。
所以更可靠的做法是,在锁屏脚本里直接给系统发一个“关闭显示器”的指令。Windows有一个经典的API调用SendMessage,只要向所有窗口广播WM_SYSCOMMAND和SC_MONITORPOWER参数,就能把显示器电源直接关掉。在之前那个Add-Type代码块里,再加两个API就可以实现:
[DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); // 在锁屏后调用 [UserIdleHelper]::SendMessage(([System.IntPtr]::new(0xFFFF)), 0x0112, 0xF170, 2)这段代码执行的效果是:锁屏的同时显示器进入待机状态,屏幕立即熄灭,不依赖系统电源计划的空闲计时。这样不管系统怎么想,你人走了之后屏幕一定是黑着的。锁屏之后,你按一下键盘或动一下鼠标,显示器会重新点亮并显示登录界面,因为那个指令是广播式的,只切断显示器的视频信号,不影响输入设备。
3.4 第四步:外设电源切断的两种落地方式
外设断电是这套方案的收尾环节,我见过两种落地方式,成本和使用体验差别很大。
第一种是带独立开关的USB Hub或排插。把所有不常用的USB设备、充电线、音箱电源线集中接上去,锁屏后你自己按一下开关断电。这种方式搭配手动习惯非常好用,而且零学习成本。但它的缺点是依赖手动,你忘了关它就白搭。
第二种是用智能插座实现自动联动。选一个支持局域网HTTP API的智能插座,把显示器或音箱接到插座上,然后在锁屏脚本里把锁屏和关插座的动作放一起。以下是示意代码,不同品牌的API差异很大,实际使用时需要换成你自己插座对应的接口:
# 锁屏后调用智能插座断电,接口地址按你的设备改为实际值 Invoke-RestMethod -Uri "http://192.168.1.100/cmd?dev=power&act=off" -Method Post注意这里的“局域网API”很关键。很多智能插座只能用手机App通过云端控制,脚本根本没法直接调用,那就不太适合自动联动。我个人的建议是,如果不是特别追求全自动,完全可以用普通排插加手动开关,因为每天离开电脑时的操作只多一步,但稳定性和可靠性反而更高。
4. 完整配置清单与参数详解
有了脚本,还需要把它挂到系统里,并处理好和电源计划、计划任务、输入设备之间的关系。这一节是整套配置的参数级拆解,照着设置就能跑。
4.1 电源计划高级设置逐项对照
脚本只是触发锁屏和黑屏,但锁屏前的这30分钟里,系统本身的耗电策略同样需要设置好。我把我实际在用的电源计划高级设置列成了下表,每个参数都有设置逻辑。
| 设置项 | 建议值 | 说明 |
|---|---|---|
| 关闭显示器(接通电源) | 15分钟 | 作为锁屏前的兜底,防止脚本意外失效时屏幕一直亮 |
| 睡眠(接通电源) | 从不 | 因为我们要的是锁屏而非睡眠,睡眠会中断任务和网络连接 |
| 关闭硬盘(接通电源) | 20分钟 | 机械硬盘适用,减少磨损;如果你全是SSD,可以设更长 |
| USB选择性挂起 | 已启用 | 允许系统把空闲的USB设备挂起,降低主板待机功耗 |
| PCI Express链接状态电源管理 | 中等功率节省 | 对独立显卡尤其有用,空闲时能显著降低GPU空载功耗 |
| 处理器最小/最大状态 | 5%/100% | 默认即可,锁屏后处理器会自动降频 |
这里要特别提醒,睡眠改成“从不”是有意为之。很多人觉得节能就该让电脑睡过去,但如果你想下班后远程连回来下载东西,或者后台任务还没跑完,睡眠会直接把所有工作打断。这套方案的主旨是锁屏加断外设,而不是让主机也睡死过去。如果你确实想让主机也睡眠,可以单独设一个更长的睡眠时间,比如120分钟,但要注意是否开启网络唤醒功能。
4.2 计划任务注册与触发条件
脚本不能每次手动跑,需要让它开机登录后自动运行。最稳的方式是注册到任务计划程序。
打开“任务计划程序”,点击“创建任务”。在“常规”选项卡里填好名称,选择“只在用户登录时运行”,并勾选“使用最高权限运行”。在“触发器”选项卡里新建一个触发器,选择“登录时”,延迟10秒启动,让桌面加载完再跑脚本。在“操作”选项卡里新建操作,程序填powershell.exe,参数填:
-WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Scripts\AutoLock.ps1"注意这里的-ExecutionPolicy Bypass很重要,很多人的脚本不执行就是因为系统默认执行策略限制了PowerShell脚本运行。-WindowStyle Hidden让脚本后台运行,不会弹出黑色控制台窗口。
在“条件”选项卡里,务必取消勾选“只有在计算机使用交流电源时才启动”,否则笔记本拔电后用电池时脚本不会运行。同时在“设置”选项卡里,把“如果任务已在运行,则以下规则适用”选成“不启动新实例”。这一步可以避免重复登录触发多个脚本,导致锁屏逻辑混乱。
任务计划注册好以后,可以先右键“运行”一次,确认脚本能正常挂到后台,再去电源设置里把显示器关闭时间调好。
4.3 键鼠唤醒与误触重置问题
锁屏脚本跑起来以后,有一个细节容易被忽略:鼠标的微小移动会被系统当成有效输入,从而重置空闲计时。
比如你在开会,电脑屏幕已经锁了,鼠标放在桌上,桌边有人走过碰了一下桌子,鼠标就动了一下。按系统逻辑,这算是一次输入,空闲计时归零。如果鼠标频繁被碰,那么电脑可能一整天都锁不上屏。
这个问题没有完全软件层面的解法,因为我们确实没法区分“人在操作”和“鼠标被碰”。能做的只有几个缓解措施:一是把鼠标放在鼠标垫上,减少外界震动干扰;二是无线鼠标的用户把接收器插得离震动源远一点;三是接受现实,把空闲阈值适当缩短,比如从30分钟改到15分钟,这样即使偶发重置,最终也能较快锁屏。
另外还要注意,键盘上如果有按键卡住或接触不良,也会持续产生输入信号。排查“为什么总不锁屏”时,先确认键鼠这些输入设备没有发生硬件级误触,再怀疑脚本。
4.4 锁屏后如何保持外设断电状态
当你用智能插座或者手动开关把外设断电后,有个新问题会出现:某些外设设备在重新通电时会自动开机,显示器甚至可能恢复到你离开前的画面和状态。
这是因为很多显示器、音箱内部有自己的通电自启动逻辑,断电后再上电,它们会直接恢复工作,哪怕电脑还处于锁屏状态。这在节能上没什么问题,但如果你期望的是“人不在时外设彻底关机”,这个行为可能会让耗电反弹。
解决办法很朴素:一是优先选择带有硬开关的排插或Hub,关断后再上电需要手动开启,不会自动恢复;二是给智能插座设置断电后不再自动通电的规则,很多智能插座默认断电后再次通电会恢复到默认开启状态,需要到App里把“断电记忆”功能关掉,或者直接把通电策略设为“保持关闭”。这些细节在配置智能插座时最好一次设置好,省得后面踩坑。
5. 常见问题与排查技巧实录
这套方案我实际用了一个季度,中间踩过不少坑。整理成问题清单,按出现的频率排序,每一个都是真实遇到的场景。
5.1 等了30分钟,锁屏就是不触发
最典型的症状是脚本双击能跑,放到计划任务里就不动。原因通常是执行策略限制,或者任务计划的触发器没有正确设置。排查第一步,在任务计划程序里看“上次运行结果”,如果显示0x1之类的错误,说明脚本本身启动失败;如果显示0x0但没效果,说明脚本也许在运行,但空闲判断逻辑没生效。
这里有个实操技巧:在脚本开头临时加一行Write-Host "script started" -NoNewline,改成在控制台直接运行。如果控制台能打印脚本启动信息,说明执行策略没问题,问题在空闲判断或计划任务参数。如果连启动信息都没有,那就是PowerShell执行策略把它拦住了,检查-ExecutionPolicy Bypass有没有写对。
还有一种情况是鼠标微动。你可以把脚本里的日志输出加进来,每轮循环输出当前空闲数值:
Write-Host ("idle ms: " + $idleMs)然后用控制台窗口挂一小会儿,观察数值是不是一直在增长。如果数值从来没有逼近过阈值,十有八九是输入设备在持续产生假输入,而不是脚本写错了。
5.2 人明明在看视频,却被判定为“无操作”
这是脚本方案最绕不开的痛点。GetLastInputInfo只认物理输入,你人坐在屏幕前看视频、看网页长文不动鼠标,它照样觉得你空闲了。
我的解决办法是加一个例外进程列表。在锁屏触发前,先检查当前正在运行的前台应用是否在“白名单”里,如果在就跳过本次锁屏判断,继续等待。示意代码大体是这个思路:
$activeApp = Get-Process | Where-Object { $_.MainWindowTitle -ne "" } | Sort-Object StartTime -Descending | Select-Object -First 1 if ($activeApp -and $activeApp.ProcessName -match "vlc|mpv|chrome|firefox") { Start-Sleep -Seconds 5 continue }这里的白名单可以根据你自己常用的软件调整。注意不要把所有浏览器都放进去,否则你可能开着网页但又不在电脑前,它也不会锁屏。我的建议是只放视频播放器和演示软件,其他应用一律按空闲处理。
5.3 电源计划里的“关闭显示器”和脚本锁屏互相打架
如果电源计划里设了10分钟关闭显示器,脚本设了30分钟锁屏,那么锁屏前屏幕会先黑掉。表面看没毛病,但会遇到一个让人迷惑的情况:屏幕黑着,你以为已经锁屏了,按一下键盘,结果屏幕亮了,直接显示桌面而不是登录界面,原来压根没锁。
这是因为“关闭显示器”不等于“锁屏”。屏幕关闭期间,Windows还保持解锁状态,任何一点输入都会让屏幕重新亮起来。所以我建议把电源计划里的“关闭显示器”时间设置得比锁屏时间略短,比如15分钟,作为早期黑屏;而真正的锁屏由脚本在30分钟触发。这样既能在锁屏前省掉一部分屏幕耗电,又能保证较长时间无人操作时一定进入锁屏状态。
5.4 智能插座断电后,键盘鼠标失灵
这是我最想强调的一个坑。最初我把无线键鼠的接收器插在了一个带独立开关的USB Hub上,然后把整个Hub接到了智能插座上。结果锁屏触发后插座断电,键鼠跟着全断,我人回来了发现电脑怎么也唤不醒,只能长按电源键重启。
这个教训很直接:任何受控制的断电设备,都不能包含机箱直接使用的输入设备。键鼠要么直连主板USB口,要么接在不受控制的普通Hub上。受控插座上只能放显示器、音箱、打印机、充电线这些“不需要随时操作”的外设。
如果你确实需要切断键鼠的电源,那就要保证断电后存在物理恢复手段,比如在桌面上留一个键盘直连的USB口,或者用机箱上的前置USB口接一套备用键鼠。别把所有的输入通道全塞进受控设备里。
5.5 休眠后任务计划不执行,锁屏脚本消失
在笔记本上容易遇到这个情况:合盖睡眠再打开,电源计划里的“关闭显示器”和“睡眠”设置还在,但脚本对应的任务计划好像没有重新拉起进程,锁屏功能失效。
原因是任务计划默认不会在恢复时自动重启“正在运行”的任务。解决方案有两种:一是在计划任务的“条件”选项卡里,勾选“唤醒计算机以运行此任务”,并把触发器改成“工作站解锁时”或“登录时”;二是在注册任务时把“设置-如果任务已启动,则停止”等参数都放开,让系统在休眠恢复后重新拉起。
我最推荐的方式还是触发条件用“登录时”,并在脚本外层加一个死循环,保证只要用户登录,脚本就常驻运行。毕竟锁屏这种事,失败一次就可能带来数据安全风险,宁可多一个常驻进程占几MB内存,也比关键时刻不工作强。
6. 扩展:从“单机节能”到“全屋自动化”
这套方案稳定运行之后,你会发现它其实不只解决电脑节能,还可以作为整个工作区自动化的一部分往外延伸。
6.1 一个空闲事件驱动全屋设备
当锁屏脚本已经能稳定触发之后,每次“电脑空闲锁屏”就是一个现成的事件信号。你可以在脚本里继续追加动作,把显示器、音箱断电之外的事情也一起做掉。比如给手机发一条通知,告诉家里人你已经离开座位;或者切换客厅的智能音箱到夜间模式;再或者把工作区的灯光调暗,避免人走灯亮白费电。
实现方式就是在脚本的锁屏动作后面继续调用LAN API,和前面智能插座断电的写法完全一致,只是把URI换成对应设备的接口。需要注意的是,同一个脚本里联动设备越多,任何一个设备接口超时都可能拖慢锁屏主流程,所以建议用Start-Process异步调用外部请求,或者把联动动作放到独立脚本里,别让网络请求卡住锁屏逻辑。
6.2 记录空闲与节能日志
如果你想量化这套方案的节能效果,可以在脚本里加一个写日志的动作。锁屏触发时,往一个CSV文件里追加一行记录,包含锁屏时间和锁屏前累计空闲时间:
Add-Content -Path "C:\Scripts\locklog.csv" -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'),$($idleMinutes)"攒一个月之后,用表格软件打开统计,配合智能插座App自带的电量统计,就能算出显示器、音箱这些外设被切断电源后省了多少度电。这些数据虽然不能直接换算成钱,但对判断方案效果很直观。
6.3 不同场景切换
最后提一个贴近实际使用的扩展:把“30分钟无操作锁屏”做成一个可切换的模式。比如你白天下班后挂着下载任务,可能希望电脑一晚上都不锁屏;而周末在家,人可能随时走开,又希望锁屏阈值短一点。
实现方式很简单:复制两个脚本,分别写成不同的阈值参数,再用两个计划任务绑定不同的热键或手动切换方式。平时默认启用30分钟版,需要挂机时先禁用当前任务,再启用“不休眠不锁屏”版。命令行切换如下:
Disable-ScheduledTask -TaskName "AutoLock30" Enable-ScheduledTask -TaskName "AutoLockNever"这个切换动作我一般配合桌面快捷方式使用,双击就能切换,比打开任务计划程序翻找方便得多。脚本本身并不复杂,真正复杂的是把不同场景下的预期梳理清楚。
我个人最后用着最顺的方案,其实没有做太多花哨的联动:显示器关闭和锁屏完全靠脚本控制,插座断电是手动按排插开关,USB Hub上的充电设备随走随切。自动联动虽然听起来高级,但多一个环节就多一个故障点。先把最核心的锁屏和显示器关闭跑稳定,再谈外设自动断电,才能让这套系统长期可靠地替你干活。