本文目录导读:

- 场景一:批量让局域网中的 Windows 电脑休眠(最实用)
- 场景二:批量让局域网中的 Linux 电脑休眠(服务端常用)
- 场景三:通过 Wake-on-LAN 实现“一键休眠所有”+“定时唤醒”
- 总结建议
可以的,针对“批量休眠”这个需求,取决于你想休眠的对象是什么,主要有以下几种常见的场景和对应的实用脚本。
明确一点: 这里的“休眠”通常指主机进入睡眠/挂起状态(S3睡眠),而不是“休眠到硬盘(S4休眠)”,因为从脚本批量触发S4(完全断电但保存状态)的兼容性较差,而S3(挂起到内存)是网络批量操作最常用的。
以下是三种最常见且实用的批量休眠脚本方案:
批量让局域网中的 Windows 电脑休眠(最实用)
如果你在一个公司内网或有域环境/相同管理员权限的工作组,可以用 PowerShell 脚本远程让多台电脑休眠。
核心原理: 利用 Windows 的远程关机命令 shutdown 或 WMI(Windows Management Interface)。
实用脚本(PowerShell):
# 批量休眠脚本 (需以管理员身份运行)
# 1. 定义你要休眠的电脑列表
$computers = @(
"PC-Office-01",
"PC-Office-02",
"192.168.1.101",
"192.168.1.102"
# 也可以从文本文件读取: Get-Content "C:\list.txt"
)
# 2. 遍历列表并发送休眠命令
foreach ($pc in $computers) {
Write-Host "正在尝试让 $pc 休眠..." -ForegroundColor Yellow
# 方法A:使用 shutdown (最简单,需要目标机开启远程注册表或权限允许)
# /h 代表休眠;/f 强制关闭正在运行的应用程序
shutdown /m \\$pc /h /f
# 方法B:shutdown 不行,可以试试 WMI (更底层)
# (Get-WmiObject -Class Win32_OperatingSystem -ComputerName $pc).Win32Shutdown(4)
# 注意: Win32Shutdown(4) 是S3睡眠,对于Win10/11可能需要特定权限
Start-Sleep -Seconds 2 # 稍作等待,避免命令冲突
}
Write-Host "批量休眠命令已发送完毕。" -ForegroundColor Green
前置条件(关键):
- 管理员权限: 运行脚本的用户必须是目标电脑的本地管理员组成员。
- 网络发现: 目标电脑需开启网络发现和文件共享,或防火墙放行
远程服务管理(RPC-EPMAP)。 - 注册表(如shutdown失败): 目标机可能需要修改注册表允许远程关机。
- 路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System - 新建DWORD:
LocalAccountTokenFilterPolicy= 1 (允许UAC账户远程管理)
- 路径:
批量让局域网中的 Linux 电脑休眠(服务端常用)
在 Linux 中,休眠(挂起)通常通过 rtcwake 或 systemctl 控制。
实用脚本(Bash):
#!/bin/bash
# 批量休眠脚本 (需通过 SSH Key 免密登录)
# 定义服务器列表
SERVERS=("server1.example.com" "server2.example.com" "192.168.1.200")
# SSH 用户名
USER="root"
for HOST in "${SERVERS[@]}"; do
echo "正在让 $HOST 休眠..."
# -t 5 表示延迟5秒后休眠;mem 是挂起到内存
ssh $USER@$HOST "echo mem > /sys/power/state"
# 或者使用 systemctl: ssh $USER@$HOST "systemctl suspend"
done
echo "批量休眠命令执行完成。"
前置条件:
- 配置了 SSH 免密登录(使用公钥)。
- 目标 Linux 主机已正确配置 ACPI(电源管理)。
- 通常需要
root权限或sudo免密执行systemctl suspend。
通过 Wake-on-LAN 实现“一键休眠所有”+“定时唤醒”
这是更高级的两步操作:先批量休眠,再定时/远程唤醒。
脚本逻辑:
- 用上述脚本让所有机器休眠。
- 记录下所有机器的 MAC 地址。
- 如果需要唤醒,发送魔术包(Wake-on-LAN)。
实用脚本片段(休眠+记录):
# PowerShell 休眠并输出 MAC 地址
$computers = @("PC1", "PC2")
foreach ($pc in $computers) {
shutdown /m \\$pc /h /f
# 获取该机器的 MAC 地址 (需要知道其IP)
$ip = [System.Net.Dns]::GetHostAddresses($pc) | Where-Object { $_.AddressFamily -eq 'InterNetwork' }
$mac = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $pc | Where-Object { $_.IPEnabled -eq $true } | Select-Object -ExpandProperty MACAddress
Write-Output "$pc 的 MAC 地址: $mac"
}
总结建议
| 你的环境/需求 | 推荐方案 | 复杂程度 |
|---|---|---|
| 纯Windows内网 (有域或管理员权限) | PowerShell + shutdown /h |
低 |
| 混合环境 (Windows+Linux) | 分开写脚本,分别用 shutdown 和 systemctl |
中 |
| 想一键关+远程唤醒 | 编写脚本记录MAC,配合 WOL 工具 | 中高 |
| 不想写代码 | 使用免费的 Advanced IP Scanner (可以远程关机/休眠,但需安装代理) | 低 |
核心提醒: 批量休眠最容易出现的问题是 权限不足,如果你的电脑不是域控且没有本地管理员密码,shutdown 命令会失败,此时需要手动配置每台电脑的UAC策略(改注册表)或使用本地系统账户执行任务。