如何在PowerShell foreach循环中遇WinRM问题时跳过当前服务器?
PowerShell脚本优化:WinRM无法访问时跳过后续操作
原脚本从myservers.txt读取服务器列表,依次执行网络共享检查、C:\Temp目录检查/创建、安装包复制、远程脚本执行。需要实现:当遇到WinRM无法访问服务器的问题时,不执行Invoke-Command及后续操作,直接跳转到下一个服务器。
修改后的脚本
foreach ($server in (Get-Content .\myservers.txt)) { # 检查网络共享访问权限 if (Test-Path "\\mynetshare\package"){ Write-Host "[$server] 可访问网络共享" -ForegroundColor Green } else { Write-Host "[$server] 无法访问网络共享" -ForegroundColor Red } # 检查并创建C:\Temp目录 if (Test-Path "\\$server\c$\Temp"){ Write-Host "[$server] 已存在C:\Temp目录" -ForegroundColor Green } else { Write-Host "[$server] 不存在C:\Temp目录,正在创建..." try { New-Item -Type Directory "\\$server\c$\Temp" -Force -ErrorAction Stop Write-Host "[$server] C:\Temp目录创建成功" -ForegroundColor Green } catch { Write-Host "[$server] 创建C:\Temp目录失败:$($_.Exception.Message)" -ForegroundColor Red continue # 目录创建失败,后续操作无意义,直接跳下一个服务器 } } # 复制安装包到目标服务器 try { Copy-Item -Path "\\mynetshare\package\package.msi" -Destination "\\$server\C$\Temp" -Recurse -ErrorAction Stop Write-Host "[$server] 安装包复制成功" -ForegroundColor Green } catch { Write-Host "[$server] 安装包复制失败:$($_.Exception.Message)" -ForegroundColor Red continue # 复制失败,远程执行无法进行,跳下一个服务器 } # 检查WinRM连通性并执行远程脚本 try { # 提前验证WinRM是否可用 Test-WSMan -ComputerName $server -ErrorAction Stop | Out-Null Write-Host "[$server] WinRM连通正常,开始执行远程脚本..." -ForegroundColor Green Invoke-Command -ComputerName $server -ScriptBlock { # 替换为你的实际远程执行逻辑 Write-Host "远程脚本执行中..." } -ErrorAction Stop Write-Host "[$server] 远程脚本执行完成" -ForegroundColor Green } catch { Write-Host "[$server] WinRM访问失败或远程执行出错:$($_.Exception.Message)" -ForegroundColor Red continue # 跳转到下一个服务器 } }
关键改动说明
- WinRM提前校验:使用
Test-WSMan命令在执行远程脚本前验证服务器的WinRM连通性,一旦失败直接捕获异常并跳过后续操作 - 异常捕获与跳转:给所有可能失败的操作(目录创建、文件复制、WinRM访问、远程执行)加上
try/catch块,搭配continue关键字,失败时直接进入下一次循环,不执行后续步骤 - 操作日志优化:所有输出增加
[$server]前缀,清晰区分每个服务器的操作状态,便于排查问题
内容的提问来源于stack exchange,提问作者Bombbe
相关产品推荐
相关产品推荐

