我在这方面遇到了困难,但我正在尝试在两台服务器之间进行比较,并让它们将一台服务器与另一台服务器的所有文件进行比较。甚至在子文件夹中。到目前为止,我已经用它来比较文件夹名称和文件,但无法进入文件夹并比较内容。以下是我尝试过的一些方法。
$A = Get-ChildItem -Recurse -path $Path
$B = Get-ChildItem -Recurse -path $PAth1
Compare-Object -ReferenceObject $A -DifferenceObject $B -PassThru
这是我开始的,它效果最好,但仍然没有进入子文件夹。我还尝试将foreach语句与Arrays一起用于将内容存储在数组中并比较数组,但这似乎根本不起作用。
$FileDirectoryA = "Path"
$FileDirectoryC = "path"
$A = foreach($folderA in Get-ChildItem $fileDirectoryA)
{
$FolderA
}
$B = foreach($FileA in Get-ChildItem $ArrayA)
{
$FileA
}
$C = foreach($folderC in Get-ChildItem $fileDirectoryC)
{
$FolderC
}
$D = foreach($FileC in Get-ChildItem $ArrayC)
{
$FileC
}
Compare-Object $B $D
当我尝试做时
Compare-Object $Path $Path2
它在所有文件夹上都错误地说权限被拒绝,这对我来说没有多大意义。
谢谢,Andrew
如果您指定要比较的属性,它应该可以工作:
$a = ls c:temp -rec
$b = icm -computername $servername -scriptblock{ls c:temp -rec}
compare $a $b -Property fullname
更可靠的方法可能是使用自动复制robocopy.exe \serverAFolder1 \serverBFolder2 /e /l /log:c:tempdif.txt
我认为这个powershell脚本https://github.com/oflisback/dirdiff解决您的问题,它扫描两个目录并报告差异:
PS C:> dirdiff.ps1 C:dir1 C:dir2
One identical file:
.identical.txt
One file only present in C:dir1:
.newdir1.txt
2 files only present in C:dir2:
.newdir2.txt
.newdirnewfilesdir2.txt
One file present in both directories and has different content:
.modified.bin
剧本就是基于这个要点,所以这要归功于切坎伯林。
Get-ChildItem $Source -Recurse | ForEach-Object{
$Dest = Join-Path $Destination $_.FullName.Substring($Source.Length)
$bool = Test-Path $Dest
if(!$bool){
#Write of some thing here to indicate difference
}
}
我认为这应该会给你一个合理的比较。如果您愿意,可以在返回值上使用regex来重建原始文件路径。
$Dir1="C:Test"
$Dir2="C:Test2"
$A=(Get-ChildItem $Dir1 -Recurse).VersionInfo.Filename -replace [regex]::Escape($Dir1),""
$B=(Get-ChildItem $Dir2 -Recurse).VersionInfo.Filename -replace [regex]::Escape($Dir2),""
Compare-Object $A $B
这会重复输出,如。。。
InputObject SideIndicator
----------- -------------
New foldertemp.txt =>
temp.txt <=
New folderNew foldertemp.txt <=
更新
我认为应该做你想要的一切。您需要更改$Dir1
和$Dir2
的值。它可能过于复杂,但看起来确实有效。
$Dir1="C:Test"
$Dir2="C:Test2"
$Items1=Get-ChildItem $Dir1 -Recurse
$Items2=Get-ChildItem $Dir2 -Recurse
$A=$Items1.VersionInfo.Filename -replace [regex]::Escape($Dir1),""
$B=$Items2.VersionInfo.Filename -replace [regex]::Escape($Dir2),""
$Exist_Diff=Compare-Object $A $B
$Exist_Diff | %{
$Current_Item=$_.InputObject
if($_.SideIdicator -eq "<="){
Write-Host "No file equivilent to $Dir1$Current_Item found in $Dir2"
}else{
Write-Host "No file equivilent to $Dir2$Current_Item found in $Dir1"
}
}
$Items1 | %{
if ($Exist_Diff.InputObject -notcontains ($_.VersionInfo.Filename -replace [regex]::Escape($Dir1),""))
{
$MatchingFile=[string]$_.VersionInfo.Filename -replace [regex]::Escape($Dir1),$Dir2
try{if(Test-Path $MatchingFile)
{
if((Get-Item $MatchingFile).length -gt $_.Length)
{
Write-host $_.fullname "is larger than" $MatchingFile
}
}}catch{}
}
}
$Items2 | %{
if ($Exist_Diff.InputObject -notcontains ($_.VersionInfo.Filename -replace [regex]::Escape($Dir1),""))
{
$MatchingFile=[string]$_.VersionInfo.Filename -replace [regex]::Escape($Dir2),$Dir1
try{if(Test-Path $MatchingFile)
{
if((Get-Item $MatchingFile).length -gt $_.Length)
{
Write-host $_.fullname "is larger than" $MatchingFile
}
}}catch{}
}
}