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
相关产品推荐
相关产品推荐

