如何使用批处理文件检查 Windows 10 上夜灯是否启用并启用/禁用它?

如何使用批处理文件检查 Windows 10 上夜灯是否启用并启用/禁用它?

如何使用批处理文件检查 Windows 10 上的夜灯是否已启用?我认为可以从 Windows 注册表访问它,但我不确定如何操作。

我正在努力设置/更改蓝光减少设置的值。

我发现以及许多其他命令,但我不确定如何仅获取值而不更改设置(我也不知道哪个命令用于获取,哪个命令用于设置,或者我应该把它放在哪个文件中)。

如果我可以使用 BAT 文件来执行此操作会更好,使用 Python 甚至更好。

如果没有可以执行此操作的 API/库,我会获取键的值来检查夜灯是否启用,并更改其值以启用/禁用夜灯。

如果涉及 Windows 注册表,请指定它是什么语言以及代码应该在哪个文件中(例如,如果是批处理代码则为 .bat,如果是 Python 则为 .py)。

答案1

这是直接复制/粘贴自另一个超级用户的回答(经过本·N),这是我通过点击您的链接找到的。这对您不起作用的原因是什么?说实话,考虑到我复制/粘贴了这个,我不应该得到赞成票。但是,我可能应该得到赞成票/赏金来帮助您实现它。说实话,我试图将您的问题作为重复问题关闭,但是它不允许我这样做,因为它有赏金。我猜您想帮助理解事情,即使您的问题只是想要代码。您需要指定您尝试过的确切代码或确切答案以及它们为什么不起作用。

---------------------------------------------------------------------

经过大量实验,我设法或多或少地找出了该注册表值的格式,并编写了一个 PowerShell 脚本来设置它。

在 21H2 上测试

并且可能适用于最早 2019 年更新的版本。

Function Set-BlueLightReductionSettings {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$StartHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$StartMinutes,
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$EndHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$EndMinutes,
        [Parameter(Mandatory=$true)] [bool]$Enabled,
        [Parameter(Mandatory=$true)] [ValidateRange(1200, 6500)] [int]$NightColorTemperature
    )
    $data = (0x43, 0x42, 0x01, 0x00, 0x0A, 0x02, 0x01, 0x00, 0x2A, 0x06)
    $epochTime = [System.DateTimeOffset]::new((date)).ToUnixTimeSeconds()
    $data += $epochTime -band 0x7F -bor 0x80
    $data += ($epochTime -shr 7) -band 0x7F -bor 0x80
    $data += ($epochTime -shr 14) -band 0x7F -bor 0x80
    $data += ($epochTime -shr 21) -band 0x7F -bor 0x80
    $data += $epochTime -shr 28
    $data += (0x2A, 0x2B, 0x0E, 0x1D, 0x43, 0x42, 0x01, 0x00)
    If ($Enabled) {$data += (0x02, 0x01)}
    $data += (0xCA, 0x14, 0x0E)
    $data += $StartHour
    $data += 0x2E
    $data += $StartMinutes
    $data += (0x00, 0xCA, 0x1E, 0x0E)
    $data += $EndHour
    $data += 0x2E
    $data += $EndMinutes
    $data += (0x00, 0xCF, 0x28)
    $data += ($NightColorTemperature -band 0x3F) * 2 + 0x80
    $data += ($NightColorTemperature -shr 6)
    $data += (0xCA, 0x32, 0x00, 0xCA, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00)
    Set-ItemProperty -Path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Current\default$windows.data.bluelightreduction.settings\windows.data.bluelightreduction.settings' -Name 'Data' -Value ([byte[]]$data) -Type Binary
}

格式(或者更确切地说A工作格式,因为“设置”应用可以创建多个略有不同的布局):

  • 10 个常量字节
  • 最后修改的 Unix 时间戳(以秒为单位),被损坏并分布在 5 个字节中,可能是可变长度的编码:
    • 一个字节,其位 0-6 是时间戳的位 0-6,但其最高位 7 始终被设置
    • 一个字节,其 0-6 位是时间戳的 7-13 位,但其最高位始终被设置
    • 同样,对于另外两组 7 位
    • 最后一个字节为时间戳 28-31 位,最高位未设置
  • 8 个常量字节
  • 仅当启用计划时:常量字节0x020x01
  • 3 个常量字节
  • 开始时间
  • 常量字节0x2E(可能是字段分隔符或类型)
  • 开始时间
  • 4 个常量字节
  • 末日时刻
  • 0x2E再次出现常量字节
  • 3 个常量字节
  • 夜间色温(开尔文),两个混乱的字节:
    • 一个字节,其低位 0 始终未设置,位 1-6 为温度的位 0-5,最高位 7 始终设置
    • 一个字节用于表示温度的第 6 位及以上,最高位未设置
  • 10 个常量字节

已在 1703/1709 上测试

并且可能最晚可在 2018 年更新后运行。

Function Set-BlueLightReductionSettings {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$StartHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$StartMinutes,
        [Parameter(Mandatory=$true)] [ValidateRange(0, 23)] [int]$EndHour,
        [Parameter(Mandatory=$true)] [ValidateSet(0, 15, 30, 45)] [int]$EndMinutes,
        [Parameter(Mandatory=$true)] [bool]$Enabled,
        [Parameter(Mandatory=$true)] [ValidateRange(1200, 6500)] [int]$NightColorTemperature
    )
    $data = (2, 0, 0, 0)
    $data += [BitConverter]::GetBytes((Get-Date).ToFileTime())
    $data += (0, 0, 0, 0, 0x43, 0x42, 1, 0)
    If ($Enabled) {$data += (2, 1)}
    $data += (0xC2, 0x0A, 0x00) # Some users have reported this line necessary on 1709, was not needed originally
    $data += (0xCA, 0x14, 0x0E)
    $data += $StartHour
    $data += 0x2E
    $data += $StartMinutes
    $data += (0, 0xCA, 0x1E, 0x0E)
    $data += $EndHour
    $data += 0x2E
    $data += $EndMinutes
    $data += (0, 0xCF, 0x28)
    $tempHi = [Math]::Floor($NightColorTemperature / 64)
    $tempLo = (($NightColorTemperature - ($tempHi * 64)) * 2) + 128
    # Alternate proposed version (see edit history), possibly version-specific?: $tempLo = ($NightColorTemperature - ($tempHi * 64)) * 4
    $data += ($tempLo, $tempHi)
    $data += (0xCA, 0x32, 0, 0xCA, 0x3C, 0, 0)
    Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\CloudStore\Store\Cache\DefaultAccount\$$windows.data.bluelightreduction.settings\Current' -Name 'Data' -Value ([byte[]]$data) -Type Binary
}

使用它

将脚本保存为.ps1文件,然后按照启用脚本部分中的说明进行操作PowerShell 标签 wiki。然后您可以通过点源导入脚本的内容:

. ./bluelightmanagement.ps1

然后使用它提供的类似 cmdlet 的功能:

Set-BlueLightReductionSettings -StartHour 7 -StartMinutes 0 -EndHour 21 -EndMinutes 15 -Enabled $true -NightColorTemperature 6000

结果

如果您在运行命令时打开了蓝光减少页面,则“设置”应用甚至会立即更新所有内容(强度/颜色滑块除外)。要让滑块看到更改,您需要重新打开“设置”应用。

相关内容