You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于磁盘/网络活动调整Windows 11的空闲睡眠阈值,避免文件传输时自动休眠

如何基于磁盘/网络活动调整Windows 11的空闲睡眠阈值,避免文件传输时自动休眠

我完全理解你的需求——既要让电脑在真正彻底空闲(磁盘、网络活动完全停止后满1小时)时自动休眠,又要在有文件传输(不管是FTP、SMB这类网络传输,还是本地磁盘读写)时保持唤醒状态,而且不想依赖特定应用的事件触发毕竟很多传输是从网络端发起的,本地根本没有对应的应用进程。下面给你几个实用的解决方案:

一、微软官方工具:PowerToys Awake(最省心的选择)

如果你不想折腾脚本或注册表,优先试试微软官方的PowerToys工具里的Awake模块,它专门解决这类“按需保持唤醒”的问题:

  • 安装PowerToys后,打开Awake功能,切换到「智能唤醒」模式
  • 在设置里你可以自定义:
    • 磁盘使用率阈值:比如设置成5%,当磁盘读写占比超过这个数值时,阻止休眠
    • 网络流量阈值:比如设置成10KB/s,有网络传输时保持唤醒
    • 空闲超时时间:也就是活动停止后,等待多久允许系统休眠(比如设置成60分钟)
  • 这个工具会实时监控系统活动,完全符合你的场景,而且是微软官方出品,稳定性有保障。

二、自定义PowerShell脚本(高度定制化)

如果你想自己控制监控逻辑,可以写一个PowerShell脚本,定期检查磁盘和网络活动,动态阻止/允许休眠:

示例脚本

# 可自定义参数
$diskUsageThreshold = 5          # 磁盘使用率阈值(%)
$networkTrafficThreshold = 10240 # 网络流量阈值(字节/秒,即10KB)
$idleWaitMinutes = 60            # 活动停止后等待多久允许休眠(分钟)
$checkIntervalSeconds = 60       # 每次检查的间隔时间(秒)

$idleCounter = 0

while ($true) {
    # 获取磁盘平均使用率
    $avgDiskUsage = (Get-Counter '\PhysicalDisk(*)\% Disk Time').CounterSamples `
        | Where-Object { $_.InstanceName -ne '_Total' } `
        | Measure-Object -Property CookedValue -Average `
        | Select-Object -ExpandProperty Average

    # 获取网络平均流量
    $avgNetworkTraffic = (Get-Counter '\Network Interface(*)\Bytes Total/sec').CounterSamples `
        | Where-Object { $_.InstanceName -ne '_Total' } `
        | Measure-Object -Property CookedValue -Average `
        | Select-Object -ExpandProperty Average

    # 判断是否有活动
    if ($avgDiskUsage -gt $diskUsageThreshold -or $avgNetworkTraffic -gt $networkTrafficThreshold) {
        $idleCounter = 0
        # 调用系统API阻止休眠
        Add-Type @"
        using System;
        using System.Runtime.InteropServices;
        public class PowerControl {
            [DllImport("kernel32.dll")]
            public static extern uint SetThreadExecutionState(uint esFlags);
        }
"@
        [PowerControl]::SetThreadExecutionState(0x80000002) # ES_CONTINUOUS + ES_SYSTEM_REQUIRED
    } else {
        $idleCounter++
        # 达到空闲时间后允许休眠
        if ($idleCounter -ge ($idleWaitMinutes * 60 / $checkIntervalSeconds)) {
            [PowerControl]::SetThreadExecutionState(0x80000000) # ES_CONTINUOUS
        }
    }

    Start-Sleep -Seconds $checkIntervalSeconds
}

设置开机自启动

  1. 把脚本保存为KeepAwakeOnActivity.ps1
  2. 打开「任务计划程序」,创建新任务:
    • 触发器:选择「当前用户登录时」
    • 操作:选择「启动程序」,程序填powershell.exe,参数填-WindowStyle Hidden -File "C:\路径\到\你的\脚本.ps1"
    • 勾选「不管用户是否登录都要运行」(可选,如果你希望远程用户连接时也生效)

三、关于Windows原生设置的说明

遗憾的是,Windows 11原生的电源设置不会把磁盘/网络活动算作“非空闲”——它默认只看鼠标、键盘这类用户输入。虽然可以通过注册表或组策略调整部分睡眠参数,但无法实现你需要的“基于磁盘/网络活动动态调整休眠阈值”的逻辑,所以还是得靠上面两种方案。

备注:内容来源于stack exchange,提问作者Spectraljump

火山引擎 最新活动