【发布时间】:2022-11-12 20:02:45
【问题描述】:
我想运行一个 powershell 脚本,该脚本可以由用户提供目录名称,然后它将检查目录、子目录和这些目录的所有文件内容,以比较它们是否彼此相同。有 8 台服务器应该都有相同的文件和内容。下面的代码似乎没有按照我的意图做。我已经看到了 Compare-Object、Get-ChildItem 和 Get-FileHash 的使用,但还没有找到我确信确实可以完成任务的正确组合。任何和所有的帮助表示赞赏!
$35 = "\\server1\"
$36 = "\\server2\"
$37 = "\\server3\"
$38 = "\\server4\"
$45 = "\\server5\"
$46 = "\\server6\"
$47 = "\\server7\"
$48 = "\\server8\"
do{
Write-Host "|1 : New |"
Write-Host "|2 : Repeat|"
Write-Host "|3 : Exit |"
$choice = Read-Host -Prompt "Please make a selection"
switch ($choice){
1{
$App = Read-Host -Prompt "Input Directory Application"
}
2{
#rerun
}
3{
exit; }
}
$c35 = $35 + "$App" +"\*"
$c36 = $36 + "$App" +"\*"
$c37 = $37 + "$App" +"\*"
$c38 = $38 + "$App" +"\*"
$c45 = $45 + "$App" +"\*"
$c46 = $46 + "$App" +"\*"
$c47 = $47 + "$App" +"\*"
$c48 = $48 + "$App" +"\*"
Write-Host "Comparing Server1 -> Server2"
if((Get-ChildItem $c35 -Recurse | Get-FileHash | Select-Object Hash,Path).hash -eq (Get-ChildItem $c36 -Recurse | Get-FileHash | Select-Object Hash,Path).hash){"Identical"}else{"NOT Identical"}
Write-Host "Comparing Server1 -> Server3"
if((Get-ChildItem $c35 -Recurse | Get-FileHash | Select-Object Hash,Path).hash -eq (Get-ChildItem $c37 -Recurse | Get-FileHash | Select-Object Hash,Path).hash){"Identical"}else{"NOT Identical"}
Write-Host "Comparing Server1 -> Server4"
if((Get-ChildItem $c35 -Recurse | Get-FileHash | Select-Object Hash,Path).hash -eq (Get-ChildItem $c38 -Recurse | Get-FileHash | Select-Object Hash,Path).hash){"Identical"}else{"NOT Identical"}
Write-Host "Comparing Server1 -> Server5"
if((Get-ChildItem $c35 -Recurse | Get-FileHash | Select-Object Hash,Path).hash -eq (Get-ChildItem $c45 -Recurse | Get-FileHash | Select-Object Hash,Path).hash){"Identical"}else{"NOT Identical"}
Write-Host "Comparing Server1 -> Server6"
if((Get-ChildItem $c35 -Recurse | Get-FileHash | Select-Object Hash,Path).hash -eq (Get-ChildItem $c46 -Recurse | Get-FileHash | Select-Object Hash,Path).hash){"Identical"}else{"NOT Identical"}
Write-Host "Comparing Server1 -> Server7"
if((Get-ChildItem $c35 -Recurse | Get-FileHash | Select-Object Hash,Path).hash -eq (Get-ChildItem $c47 -Recurse | Get-FileHash | Select-Object Hash,Path).hash){"Identical"}else{"NOT Identical"}
Write-Host "Comparing Server1 -> Server8"
if((Get-ChildItem $c35 -Recurse | Get-FileHash | Select-Object Hash,Path).hash -eq (Get-ChildItem $c48 -Recurse | Get-FileHash | Select-Object Hash,Path).hash){"Identical"}else{"NOT Identical"}
} until ($choice -eq 3)
【问题讨论】:
-
-eq不会按照您的意愿逐一比较数组。相反,它通过 RHS 操作数过滤 LHS 数组操作数。使用Compare-Object比较数组。顺便说一句,在比较之前计算所有文件哈希会非常非常慢。一种更快的方法是仅计算第一个目录的所有文件哈希。对于后续目录,计算一个哈希值,然后立即与第一个目录中具有相同相对路径的文件进行比较。如果不同,则不需要计算目录的剩余哈希值。 -
我打赌 robocopy 可以更快地做到这一点。
-
您应该将所有服务器放在一个数组中,没有理由将它们放在单独的变量中
-
您想每次在每台服务器上比较路径输入的文件夹/内容吗?在任何时间段内其他文件夹是否有任何更改?
-
@zett42,您能否提供一些示例代码来说明您的意思?
标签: powershell server directory