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

无需WinRM/pskill,PowerShell批量远程启停特定任务的问题

多机器远程重启服务脚本问题修复

问题分析

你的脚本在多机器执行时报错、单机器正常的核心原因是变量引用错误,同时存在语法和逻辑缺陷,具体如下:

  • $ComputerName数组定义语法错误:第一个元素'computer1'后缺少逗号,会导致数组仅包含computer1,后续机器名被当作独立字符串处理
  • 循环内错误使用$ComputerName(整个机器名数组)而非当前循环变量$Computer,导致Get-Service、taskkill等操作同时针对所有机器执行,引发报错
  • While循环未重新获取服务状态,会陷入无限循环;且服务挂起时未重新查询状态就执行操作,逻辑不严谨
  • Set-Service默认依赖WinRM,违反你"不使用WinRM"的要求

修正后的脚本

# 正确定义机器名数组,每个元素后加逗号
$ComputerName = 
'computer1',
'computer2',
'computer3', 
'computer4',
'computer5',
'computer6',
'computer7',
'computer8'

# 定义目标服务名和对应进程名
$ServiceName = 'name'
$ProcessName = 'ApacheWebServices.exe'

Foreach ($Computer in $ComputerName) {
    # 尝试获取远程服务状态,添加错误处理避免单机器失败中断整个循环
    try {
        $ServiceInfo = Get-Service -Name $ServiceName -ComputerName $Computer -ErrorAction Stop
        if ($ServiceInfo.Status -eq 'Running') {
            Write-Host "$Computer Service is Running"
            continue
        }
    }
    catch {
        Write-Host "$Computer 获取服务状态失败: $_"
        continue
    }

    # 当服务未运行时,强制终止对应进程并重启服务
    while ($true) {
        # 用taskkill远程终止进程(符合不使用pskill/WinRM的要求)
        taskkill /s $Computer /IM $ProcessName /F 2>&1 | Out-Null
        Write-Host "$Computer 已强制终止进程 $ProcessName"

        # 用sc.exe远程启动服务(规避WinRM依赖)
        sc.exe \\$Computer start $ServiceName 2>&1 | Out-Null
        
        # 等待2秒后重新查询服务状态
        Start-Sleep -Seconds 2
        $ServiceInfo = Get-Service -Name $ServiceName -ComputerName $Computer -ErrorAction SilentlyContinue

        if ($ServiceInfo -and $ServiceInfo.Status -eq 'Running') {
            Write-Host "$Computer 服务已成功重启"
            break
        }
        else {
            Write-Host "$Computer 服务重启中,当前状态: $($ServiceInfo?.Status ?? '未知')"
        }
    }
}

关键修改说明

  • 修正数组定义:给所有机器名添加逗号,确保正确生成字符串数组
  • 循环变量正确引用:所有远程操作均使用$Computer(当前循环的单台机器)而非$ComputerName数组
  • 添加错误处理:用try/catch捕获Get-Service的异常,避免单机器故障导致整个脚本中断
  • 规避WinRM依赖:改用sc.exe远程启动服务,替代依赖WinRM的Set-Service
  • 优化循环逻辑:每次循环后重新查询服务状态,直到服务启动成功才退出循环,避免无限执行
  • 进程与服务对应:将进程名和服务名抽离为独立变量,便于维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:55:22