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

如何用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任务计划定期触发检测:

  1. 将上述脚本修改为单次检测模式:遍历所有主机,对在线主机执行拷贝,离线主机不做处理
  2. 在Windows任务计划中创建定时任务,设置合适的触发频率(比如每1小时执行一次)
  3. 添加一个标记文件或注册表项,记录已完成拷贝的主机,避免重复执行拷贝操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:26:06