使用 PowerShell 脚本自动更换 Windows 锁屏壁纸

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2024/06/12/rotate-lock-screen-picture-by-powershell/

Bug 11 的奇怪问题+1——锁屏幻灯片完全无法工作——无论如何选择合适的目录,它永远都只有两个错误提示:

  • 你选择的目录无法用作幻灯片放映屏幕保护程序的图片目录。
  • 你选择的目录中没有图片。

但是呢,如果你选择单张图片,而不使用幻灯片,它就可以正常显示。

好吧,我已经无法容忍微软的蠢货工程师了,所以,让我们用 Powershell 脚本来解决这个问题。

思路很简单,就是写一个 Powershell 脚本,每次运行时,从指定目录中随机选择一张图片,然后设置为锁屏壁纸。

然后再设置一个定时任务,每隔一段时间(我这里设定是一天)运行一次这个脚本,就可以实现定时随机更换锁屏壁纸了。

先看看随机选择图片并设置为锁屏壁纸的 Powershell 脚本:

 1$ImageDirectory = $PSScriptRoot # 这里是你存放图片的目录,我假设就是脚本所在的目录
 2
 3# 获得该目录下的所有文件
 4$Files = Get-ChildItem -Path $ImageDirectory
 5
 6# 过滤出图片文件
 7$ImageFiles = $Files | Where-Object { $_.Extension -in ".jpg", ".jpeg", ".png" }
 8
 9# 随机选择一张图片
10$RandomImage = Get-Random -InputObject $ImageFiles
11
12# 锁屏壁纸的注册表路径
13$Key = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\PersonalizationCSP'
14
15# 设置锁屏壁纸的注册表项
16Set-ItemProperty -Path $Key -Name LockScreenImagePath -Value $RandomImage.FullName

把这段内容保存为 set-random-lock-screen.ps1 文件,放进你的图片目录,先不要执行。

我们先按下 Win-R,输入 regedit 打开注册表编辑器,找到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PersonalizationCSP,确保该目录存在(不存在就创建一个)。

现在,我们来执行这个脚本

  1. 按下 Win-X,打开“Windows Powershell (管理员)”。
  2. 输入 cd "你的图片目录",切换到你的图片目录
  3. 输入 powershell -ExecutionPolicy Bypass -File "set-random-lock-screen.ps1",执行这个脚本。

搞定,现在锁屏,看看是不是已经更换了锁屏壁纸。

接下来,我们再来设置一个定时任务,让它每天晚上十二点运行一次这个脚本。

打开 Powershell,输入如下命令:

1$ScriptPath = "C:\Users\Demo\Pictures\LockScreenPictures\set-random-lock-screen.ps1" # 这里是你的脚本路径,请替换成你的实际路径
2
3$TaskName = "SetRandomLockScreen"
4
5$Trigger = New-ScheduledTaskTrigger -Daily -At 12am
6
7$Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$ScriptPath`""
8
9Register-ScheduledTask -TaskName $TaskName -Trigger $Trigger -Action $Action -RunLevel Highest -User "SYSTEM"

当然,你也可以改成每次开机都运行一次,或者每隔几小时运行一次,这取决于你的需求。以30分钟运行一次为例,在上面的终端里继续执行如下命令:

1$Task = Get-ScheduledTask -TaskName $TaskName
2$Task.Triggers.Repetition.Interval = 'PT30M'        # 每30分钟运行一次
3$Task.Triggers.Repetition.Duration = 'PT23H30M'     # 持续23小时30分钟
4
5$Task | Set-ScheduledTask

使用这个方案有一个好处,幻灯片有时候会组合多张图片,并不美观,影响我们欣赏图片,而使用单张图片模式则每次只会显示一张。😄

但与此同时,也有一个缺点,那就是在锁屏的时候,并不会更新锁屏壁纸,只有在解锁后才会更新。😅

comments powered by Disqus

翻译: