You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell实现跨主机计划任务批量禁用与精准恢复

PowerShell 计划任务批量禁用与精准恢复实现方案

需求说明

脚本仅保留手动触发入口,不包含自动化更新、定时触发等额外逻辑,需实现两部分核心能力:

  • 触发第一部分逻辑时,在多台目标主机上批量禁用指定路径下处于*运行(running)/就绪(ready)*状态的计划任务,为主机更新操作扫清前置阻碍
  • 触发第二部分逻辑时,仅重新启用第一部分流程中被禁用的计划任务,禁止误启用同路径下其他未被操作的任务

当前已实现基础代码

目前第一部分的批量禁用逻辑已完成初步编写,代码如下:

Invoke-Command -ComputerName xxx-11, xxx-12, xxx-14 -ScriptBlock {Get-ScheduledTask -TaskPath \yyy\ | Where {($_.State -like "running") -or ($_.State -like "ready")} | Disable-ScheduledTask }

待解决问题

现有代码缺少被禁用任务的持久化记录存储逻辑,无法记录每台主机上具体哪些任务被执行了禁用操作,不能支撑第二部分精准恢复指定被禁任务的需求。

完整实现代码

第一部分:批量禁用+操作记录留存

核心逻辑是在远程主机执行禁用操作前,先收集所有符合禁用条件的任务标识信息,回传到本地后持久化存储为CSV记录文件,作为后续恢复的唯一匹配依据,避免误启用其他任务。

# 配置项
$targetHosts = @("xxx-11", "xxx-12", "xxx-14")
$targetTaskPath = "\yyy\"
$recordSavePath = Join-Path $PSScriptRoot "disabled_tasks_operate_record.csv"

# 远程批量执行任务查询+禁用,同时回传被禁用的任务信息
$disabledTaskList = Invoke-Command -ComputerName $targetHosts -ScriptBlock {
    # 查询指定路径下处于运行/就绪状态的任务
    $targetTasks = Get-ScheduledTask -TaskPath $using:targetTaskPath | Where-Object {
        $_.State -eq "Running" -or $_.State -eq "Ready"
    }
    # 执行禁用操作
    $targetTasks | Disable-ScheduledTask | Out-Null
    # 组装回传数据:标记所属主机、任务路径、任务名三个唯一标识
    $targetTasks | Select-Object @{Name="HostName";Expression={$env:COMPUTERNAME}}, TaskPath, TaskName
}

# 将操作记录导出到本地文件
$disabledTaskList | Select-Object HostName, TaskPath, TaskName | Export-Csv -Path $recordSavePath -NoTypeInformation -Encoding UTF8

第二部分:基于记录精准恢复任务

核心逻辑是读取第一部分生成的操作记录,按主机维度分组匹配,仅对记录内的任务执行启用操作,完全不会影响同路径下其他未被禁用的任务。

# 配置项
$recordSavePath = Join-Path $PSScriptRoot "disabled_tasks_operate_record.csv"

# 前置校验:记录文件不存在则终止执行
if (-not (Test-Path $recordSavePath)) {
    throw "缺失禁用操作记录文件,无法执行任务恢复,请确认第一部分逻辑已正常执行"
}

# 读取记录并按主机名分组
$taskRecords = Import-Csv -Path $recordSavePath -Encoding UTF8
$hostTaskGroups = $taskRecords | Group-Object HostName -AsHashTable -AsString

# 逐台主机恢复对应任务
foreach ($host in $hostTaskGroups.Keys) {
    $tasksNeedEnable = $hostTaskGroups[$host]
    Invoke-Command -ComputerName $host -ScriptBlock {
        foreach ($singleTask in $using:tasksNeedEnable) {
            Enable-ScheduledTask -TaskPath $singleTask.TaskPath -TaskName $singleTask.TaskName | Out-Null
        }
    }
}

# 恢复完成后可按需取消注释下一行,删除历史记录文件
# Remove-Item $recordSavePath -Force

使用注意事项

  • 执行脚本的账号需要拥有所有目标主机的本地管理员权限,且目标主机已开启WinRM远程管理服务,允许PowerShell远程连接
  • 第一部分逻辑执行完成到第二部分恢复逻辑执行的间隔期,不要手动修改、删除生成的disabled_tasks_operate_record.csv文件,避免恢复时匹配失败
  • 间隔期尽量不要手动调整目标路径下计划任务的状态,防止出现状态冲突

内容的提问来源于stack exchange,提问作者Mortin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:45:42