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)
脚本说明
- 服务器列表优化:将服务器地址存入数组,便于扩展和遍历
- 相对路径对比:去掉服务器前缀,仅对比目录内的相对路径,确保不同服务器的文件路径可匹配
- 差异详情展示:通过
Compare-Object输出具体差异类型(缺失文件、内容不一致) - 代码复用:封装哈希获取逻辑为函数,减少重复代码
- 错误处理:添加异常捕获,处理服务器访问失败的情况
内容的提问来源于stack exchange,提问作者TFore
相关产品推荐
相关产品推荐

