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

PowerShell脚本需求:8台服务器目录及文件内容一致性对比

服务器目录一致性检查脚本修复方案

问题说明

需要编写PowerShell脚本,支持输入目录名称,检查8台服务器上指定目录(包含子目录及所有文件内容)的一致性。当前脚本未实现预期功能,需利用Get-ChildItem、Get-FileHash、Compare-Object实现正确的一致性校验。

原脚本存在的问题

  • 直接对比哈希数组的-eq操作不可靠:当文件顺序不同时,即使内容一致也会误判为不一致
  • 未基于相对路径对比:原脚本直接使用完整路径,导致不同服务器的路径无法匹配对比
  • 重复代码冗余:多次重复执行相同的文件哈希获取与对比逻辑
  • 仅返回一致/不一致结果,无法展示具体差异(如缺失文件、内容不同的文件)

修正后的脚本

# 定义服务器列表
$servers = @(
    "\\server1\",
    "\\server2\",
    "\\server3\",
    "\\server4\",
    "\\server5\",
    "\\server6\",
    "\\server7\",
    "\\server8\"
)

# 获取指定目录下的文件哈希(返回相对路径+哈希)
function Get-DirectoryFileHashes {
    param(
        [string]$ServerPath
    )
    Get-ChildItem -Path $ServerPath -Recurse -File | ForEach-Object {
        # 计算相对路径(去掉服务器前缀)
        $relativePath = $_.FullName.Substring($ServerPath.Length)
        # 获取文件哈希
        $hash = (Get-FileHash -Path $_.FullName).Hash
        # 返回自定义对象
        [PSCustomObject]@{
            RelativePath = $relativePath
            Hash         = $hash
        }
    }
}

do {
    Write-Host "|1 : 输入新目录 |"
    Write-Host "|2 : 重复上次检查 |"
    Write-Host "|3 : 退出 |"
    $choice = Read-Host -Prompt "请选择操作"

    switch ($choice) {
        1 {
            $App = Read-Host -Prompt "请输入要检查的目录名称"
            # 拼接基准服务器的完整路径(以第一台服务器为基准)
            $basePath = Join-Path -Path $servers[0] -ChildPath $App
            # 获取基准目录的文件哈希
            $baseHashes = Get-DirectoryFileHashes -ServerPath $basePath
        }
        2 {
            if (-not $baseHashes) {
                Write-Host "请先选择1输入目录进行首次检查"
                continue
            }
        }
        3 {
            exit
        }
        default {
            Write-Host "无效选择,请重新输入"
            continue
        }
    }

    # 遍历其他服务器进行对比
    for ($i = 1; $i -lt $servers.Count; $i++) {
        $currentServer = $servers[$i]
        $currentPath = Join-Path -Path $currentServer -ChildPath $App
        Write-Host "`n=== 对比 $($servers[0].TrimEnd('\')) 与 $($currentServer.TrimEnd('\')) ==="

        try {
            $currentHashes = Get-DirectoryFileHashes -ServerPath $currentPath
            # 对比哈希与相对路径
            $differences = Compare-Object -ReferenceObject $baseHashes -DifferenceObject $currentHashes -Property RelativePath, Hash

            if (-not $differences) {
                Write-Host "目录内容完全一致"
            }
            else {
                Write-Host "发现差异:"
                $differences | ForEach-Object {
                    switch ($_.SideIndicator) {
                        '<=' { Write-Host "仅基准服务器存在:$($_.RelativePath)" }
                        '=>' { Write-Host "仅当前服务器存在:$($_.RelativePath)" }
                        default { Write-Host "内容不一致:$($_.RelativePath)(基准哈希:$($baseHashes | Where-Object RelativePath -eq $_.RelativePath | Select-Object -ExpandProperty Hash) | 当前哈希:$($_.Hash))" }
                    }
                }
            }
        }
        catch {
            Write-Host "访问服务器 $currentServer 失败:$($_.Exception.Message)"
        }
    }

} until ($choice -eq 3)

脚本说明

  1. 服务器列表优化:将服务器地址存入数组,便于扩展和遍历
  2. 相对路径对比:去掉服务器前缀,仅对比目录内的相对路径,确保不同服务器的文件路径可匹配
  3. 差异详情展示:通过Compare-Object输出具体差异类型(缺失文件、内容不一致)
  4. 代码复用:封装哈希获取逻辑为函数,减少重复代码
  5. 错误处理:添加异常捕获,处理服务器访问失败的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:35:40