实用脚本能批量休眠吗?

wen 实用脚本 12

本文目录导读:

实用脚本能批量休眠吗?

  1. 场景一:批量让局域网中的 Windows 电脑休眠(最实用)
  2. 场景二:批量让局域网中的 Linux 电脑休眠(服务端常用)
  3. 场景三:通过 Wake-on-LAN 实现“一键休眠所有”+“定时唤醒”
  4. 总结建议

可以的,针对“批量休眠”这个需求,取决于你想休眠的对象是什么,主要有以下几种常见的场景和对应的实用脚本。

明确一点: 这里的“休眠”通常指主机进入睡眠/挂起状态(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

前置条件(关键):

  1. 管理员权限: 运行脚本的用户必须是目标电脑的本地管理员组成员。
  2. 网络发现: 目标电脑需开启网络发现和文件共享,或防火墙放行 远程服务管理(RPC-EPMAP)
  3. 注册表(如shutdown失败): 目标机可能需要修改注册表允许远程关机。
    • 路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
    • 新建DWORD:LocalAccountTokenFilterPolicy = 1 (允许UAC账户远程管理)

批量让局域网中的 Linux 电脑休眠(服务端常用)

在 Linux 中,休眠(挂起)通常通过 rtcwakesystemctl 控制。

实用脚本(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 实现“一键休眠所有”+“定时唤醒”

这是更高级的两步操作:先批量休眠,再定时/远程唤醒

脚本逻辑:

  1. 用上述脚本让所有机器休眠。
  2. 记录下所有机器的 MAC 地址。
  3. 如果需要唤醒,发送魔术包(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) 分开写脚本,分别用 shutdownsystemctl
想一键关+远程唤醒 编写脚本记录MAC,配合 WOL 工具 中高
不想写代码 使用免费的 Advanced IP Scanner (可以远程关机/休眠,但需安装代理)

核心提醒: 批量休眠最容易出现的问题是 权限不足,如果你的电脑不是域控且没有本地管理员密码,shutdown 命令会失败,此时需要手动配置每台电脑的UAC策略(改注册表)或使用本地系统账户执行任务。

抱歉,评论功能暂时关闭!