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

如何实现多实例并行执行服务器补丁脚本,域凭据仅需输入一次?

当然可以!你完全可以通过并行执行的方式,为每台服务器启动独立的脚本实例,同时只需要为每个域输入一次凭据。下面给你两种实用的方案,结合你的需求调整:

方案一:使用PowerShell 7+的ForEach-Object -Parallel(推荐)

如果你已经升级到PowerShell 7或更高版本,这个方法语法最简洁,并行效率也不错。核心思路是先按域分组服务器,每个域只收集一次凭据,再并行处理该域下的所有服务器:

# 先把服务器列表按域名分组,避免重复输入同一域的凭据
$serversByDomain = $ServerList | Group-Object -Property Domain

foreach ($domainGroup in $serversByDomain) {
    $currentDomain = $domainGroup.Name
    # 每个域仅输入一次凭据
    $domainCreds = Get-Credential -Message "请输入域 $currentDomain 的访问凭据"

    # 并行处理当前域下的所有服务器
    $domainGroup.Group | ForEach-Object -Parallel {
        # 用$using:前缀引用外部作用域的变量(并行块有独立作用域)
        Get-Patches -Server $_.Name -Credentials $using:domainCreds -Domain $using:currentDomain
    } -ThrottleLimit 10 # 控制并行任务数量,可根据服务器总数/网络情况调整
}

关键说明:

  • -ThrottleLimit:用来限制同时运行的并行任务数,防止一次性发起太多请求导致网络或本地资源耗尽,建议根据实际情况设置(比如10-20之间)。
  • $using::并行脚本块无法直接访问外部变量,必须通过$using:前缀引用,确保凭据和域名能正确传递到每个并行任务中。

方案二:使用Start-Job(兼容PowerShell 5.x及更早版本)

如果还在使用旧版PowerShell,Start-Job可以帮你启动独立的后台作业(每个作业对应一台服务器),同样支持按域批量输入凭据:

# 按域分组服务器列表
$serversByDomain = $ServerList | Group-Object -Property Domain
$runningJobs = @()

foreach ($domainGroup in $serversByDomain) {
    $currentDomain = $domainGroup.Name
    $domainCreds = Get-Credential -Message "请输入域 $currentDomain 的访问凭据"

    foreach ($server in $domainGroup.Group) {
        # 为每台服务器启动一个后台作业
        $job = Start-Job -ScriptBlock {
            param($TargetServer, $ServerCreds, $TargetDomain)
            # 执行补丁部署逻辑
            Get-Patches -Server $TargetServer -Credentials $ServerCreds -Domain $TargetDomain
        } -ArgumentList $server.Name, $domainCreds, $currentDomain
        
        $runningJobs += $job
    }
}

# 可选:等待所有作业完成,再获取执行结果
Wait-Job -Job $runningJobs
Receive-Job -Job $runningJobs # 输出所有作业的执行日志/结果

关键说明:

  • Start-Job会启动独立的PowerShell进程来运行每个任务,完全满足“每个服务器一个脚本实例”的需求。
  • -ArgumentList:用来给后台作业传递参数,确保每台服务器的信息和对应域的凭据能正确传入。
  • Wait-Job和Receive-Job:如果需要等待所有补丁部署完成再做后续操作,可以用这两个命令;如果不需要实时等待,也可以后续再通过Get-Job查看作业状态。

额外注意事项

  1. 错误隔离:建议在并行任务里加入try/catch块,这样单台服务器的部署失败不会影响其他服务器,还能记录错误信息:
# 以ForEach-Object -Parallel为例
$domainGroup.Group | ForEach-Object -Parallel {
    try {
        Get-Patches -Server $_.Name -Credentials $using:domainCreds -Domain $using:currentDomain
        Write-Host "✅ 服务器 $($_.Name) 补丁部署完成"
    } catch {
        Write-Error "❌ 服务器 $($_.Name) 补丁部署失败:$_"
    }
}
  1. 凭据安全:Get-Credential获取的凭据是加密存储的,传递给并行任务时不会以明文形式暴露,不用担心安全问题。
  2. 资源控制:如果服务器数量较多,不要把并行数设得过高,否则可能导致本地CPU/内存占用过高,或者被目标服务器的防火墙拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:41:59