如何用PowerShell定期检测在线主机并自动执行文件拷贝
PowerShell 主机在线检测与自动拷贝脚本实现
核心逻辑思路
维护一个待检测的目标主机列表,定期对列表内的主机执行连通性检测:
- 检测到主机在线时,调用已实现的
copyBuild函数完成文件拷贝,随后将该主机从待检测列表中移除 - 离线主机保留在列表内,继续参与下一轮检测
- 当待检测列表为空(所有主机均完成拷贝)时,脚本自动退出
完整脚本示例
# 定义待检测的目标主机列表(可根据实际需求修改) $targetHosts = @("Host01", "Host02", "192.168.1.100", "192.168.1.101") # 检测间隔(单位:秒,可根据实际情况调整) $checkInterval = 300 # 循环检测直到所有主机处理完成 while ($targetHosts.Count -gt 0) { # 遍历当前待检测主机的副本,避免遍历过程中修改原列表导致异常 foreach ($hostEntry in $targetHosts.Clone()) { Write-Host "正在检测主机 $hostEntry 状态..." # 使用Test-Connection快速检测连通性,-Quiet返回布尔值更高效 if (Test-Connection -ComputerName $hostEntry -Count 1 -Quiet -ErrorAction SilentlyContinue) { Write-Host "主机 $hostEntry 已上线,开始执行拷贝操作..." # 调用已实现的copyBuild函数,需确保该函数已在当前会话中定义 copyBuild -TargetHost $hostEntry # 将已完成拷贝的主机从待检测列表中移除 $targetHosts.Remove($hostEntry) Write-Host "主机 $hostEntry 拷贝完成,已从待检测列表移除" } else { Write-Host "主机 $hostEntry 离线,将在 $checkInterval 秒后重新检测" } } # 如果还有待检测主机,等待指定间隔后进入下一轮检测 if ($targetHosts.Count -gt 0) { Write-Host "当前仍有 $($targetHosts.Count) 台主机未处理,等待 $checkInterval 秒..." Start-Sleep -Seconds $checkInterval } } Write-Host "所有主机均已完成拷贝操作,脚本退出"
关键细节说明
Test-Connection参数优化:使用-Count 1只发送一次检测包,-Quiet直接返回布尔值,相比默认输出更适合脚本逻辑判断;加上-ErrorAction SilentlyContinue避免因主机不可达抛出冗余错误信息- 列表遍历方式:遍历
$targetHosts.Clone()副本,防止在遍历过程中修改原列表引发遍历异常 - 检测间隔设置:建议根据网络环境和主机开机频率调整,避免过于频繁检测占用网络资源,或间隔过长导致上线后无法及时处理
替代方案(针对主机无法全天开机场景)
如果脚本持续运行占用资源,可改用Windows任务计划定期触发检测:
- 将上述脚本修改为单次检测模式:遍历所有主机,对在线主机执行拷贝,离线主机不做处理
- 在Windows任务计划中创建定时任务,设置合适的触发频率(比如每1小时执行一次)
- 添加一个标记文件或注册表项,记录已完成拷贝的主机,避免重复执行拷贝操作
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

