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

修改PowerShell脚本:多机服务检查前添加用户确认功能

需求与脚本修改

需求说明

需要检查多台远程机器上的指定服务,确保它们处于运行状态;若服务未运行则启动。同时要给现有PowerShell脚本添加两个功能:

  • 处理下一台服务器前,询问用户是否继续
  • 展示当前服务器对应的所有服务状态,并让用户确认后再执行操作

服务器配置文件(servers.txt)内容

server1-serviceA,ServiceB,ServiceC
server2-serviceD,ServiceE,ServiceF
server3-serviceG,ServiceH,ServiceI

原PowerShell脚本

$textFile = Get-Content C:\temp\servers.txt

foreach ($line in $textFile) {

    $computerName = $line.split("-")[0]  #通过Split获取计算机名
    $serviceNames = $line.split("-")[1]  #通过Split获取服务名

    foreach ($serviceName in $serviceNames.split(",")) {
        #再次用Split处理多个服务名

        try {
            Write-Host " Trying to start $serviceName in $computerName"
            Get-Service -ComputerName $computerName -Name $serviceName | Start-Service -ErrorAction Stop
            Write-Host "SUCCESS: $serviceName has been started"
        }
        catch {
            Write-Host "Failed to start $serviceName in $computerName"
        }
     
    }
}

修改后的脚本(实现需求功能)

$textFile = Get-Content C:\temp\servers.txt

foreach ($line in $textFile) {
    # 拆分服务器名和服务列表
    $computerName = $line.Split("-")[0]
    $serviceList = $line.Split("-")[1].Split(",")

    # 展示当前待处理的服务器及关联服务
    Write-Host "`n=== 当前待处理服务器:$computerName ==="
    Write-Host "关联服务列表:" ($serviceList -join ", ")

    # 检查并展示每个服务的当前状态
    Write-Host "`n服务当前状态:"
    foreach ($serviceName in $serviceList) {
        try {
            $service = Get-Service -ComputerName $computerName -Name $serviceName -ErrorAction Stop
            $statusText = if ($service.Status -eq 'Running') { "运行中" } else { "已停止" }
            Write-Host "  - *$serviceName*: $statusText"
        }
        catch {
            Write-Host "  - *$serviceName*: 无法获取状态(可能不存在或权限不足)"
        }
    }

    # 询问是否继续处理当前服务器的服务
    $confirmProcess = Read-Host "`n是否继续处理该服务器的服务?(Y/N)"
    if ($confirmProcess -notmatch '^[Yy]$') {
        Write-Host "跳过服务器 $computerName`n"
        continue
    }

    # 处理服务:仅启动未运行的服务
    Write-Host "`n开始处理服务..."
    foreach ($serviceName in $serviceList) {
        try {
            $service = Get-Service -ComputerName $computerName -Name $serviceName -ErrorAction Stop
            if ($service.Status -ne 'Running') {
                $service | Start-Service -ErrorAction Stop
                Write-Host "SUCCESS: $serviceName 已启动"
            }
            else {
                Write-Host "INFO: $serviceName 已处于运行状态,无需操作"
            }
        }
        catch {
            Write-Host "FAILED: 无法处理 $serviceName - $_"
        }
    }

    # 询问是否继续处理下一台服务器
    $confirmNext = Read-Host "`n是否继续处理下一台服务器?(Y/N)"
    if ($confirmNext -notmatch '^[Yy]$') {
        Write-Host "终止脚本执行"
        break
    }
}

修改要点说明

  • 状态可视化:先获取并展示所有服务的当前状态,用加粗标记服务名,清晰区分运行、停止、异常状态
  • 双重确认机制:处理当前服务器前确认操作意向,处理完成后再确认是否推进到下一台,避免误操作
  • 逻辑优化:仅对未运行的服务执行启动命令,减少无效操作;异常捕获时输出具体错误信息,方便排查
  • 交互友好:用分隔线和换行优化输出排版,让交互过程更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:40:38