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

