在 Powershell v1.0 中比较两组文件夹和文件

Comparing two sets of folders and files in Powershell v1.0

我想生成一份报告,仅突出显示两个目录之间的差异,每个目录位于不同的远程计算机上,包含子目录和重复文件 Names

我需要两个列表:

如果来自不同服务器的两个对象具有相同的 NotePropertyProjectDir)但不同的 LastWriteTime,如何过滤掉下面的对象?

背景

我有两台服务器,它们有一组文件夹和文件,它们是单独开发的,然后在工程师对他们的工作感到满意时偶尔同步。这些工程师在将他们的工作反映到他们没有工作的服务器上方面做得很差。我想生成一份报告,以帮助指导我的团队选择要同步的内容。

我试过的

#Read in files only of project directories
$dirAItems = Get-ChildItem -Recurse -path ' D:\WORKING' | Where-Object {$_.GetType() | where-object -property "Name" -eq "FileInfo"}
$dirBItems = Get-ChildItem -Recurse -path ' E:\WORKING' | Where-Object {$_.GetType() | where-object -property "Name" -eq "FileInfo"}

#Compute relative paths
 $dirAItems| foreach-Object {
    $_ | Add-Member -MemberType NoteProperty -Name 'ProjectDir' -Value ($_.FullName.Replace("D:\WORKING","PROJECT"))
}
 $dirBItems| foreach-Object {
    $_ | Add-Member -MemberType NoteProperty -Name 'ProjectDir' -Value ($_.FullName.Replace("E:\WORKING","PROJECT"))
}

#Get the discrepancies and assign to Server1List or Server2List
Compare-Object -ReferenceObject $dirAItems -DifferenceObject $dirBItems -Property ProjectDir, LastWriteTime

$ServerAItemsOfInterest = Compare-Object -ReferenceObject $dirAItems -DifferenceObject $dirBItems -Property ProjectDir, LastWriteTime | Where-Object -Property SideIndicator -eq "<="

$ServerBItemsOfInterest = Compare-Object -ReferenceObject $dirAItems -DifferenceObject $dirBItems -Property ProjectDir, LastWriteTime | Where-Object -Property SideIndicator -eq "=>"

"Server A Items of Interest:"
$ServerAItemsOfInterest

"
Server B Items of Interest:"
$ServerAItemsOfInterest

输出

Server A Items of Intereset:

ProjectDir                                 LastWriteTime       SideIndicator
----------                                 -------------       -------------
PROJECT\File 2 - A is newest.txt           16/04/2021 14:55:24 <=           
PROJECT\File 3 - B is newest.txt           16/04/2021 12:04:06 <=           
PROJECT\File 4 - A only.txt                16/04/2021 12:06:47 <=           
PROJECT\SubDir1\File 1.2 - A is newest.txt 16/04/2021 15:35:26 <=           
PROJECT\SubDir1\File 1.3 - B is newest.txt 16/04/2021 12:04:06 <=           
PROJECT\SubDir1\File 1.4 - A only.txt      16/04/2021 12:06:47 <=           

Server B Items of Intereset:
PROJECT\File 2 - A is newest.txt           16/04/2021 12:04:06 =>           
PROJECT\File 3 - B is newest.txt           16/04/2021 12:06:31 =>           
PROJECT\SubDir1\File 1.2 - A is newest.txt 16/04/2021 12:06:17 =>           
PROJECT\SubDir1\File 1.3 - B is newest.txt 16/04/2021 14:55:13 => 

我需要一种方法来过滤掉 $ServerAItemsOfInterest 中的对象,其中 $ServerBItemsOfInterest 中有一个对象具有相同的 ProjectDir 并且 LastWriteTime 在服务器 B 等上更大所以输出是:

Server A Items of Interest:

ProjectDir                                 LastWriteTime       SideIndicator
----------                                 -------------       -------------
PROJECT\File 2 - A is newest.txt           16/04/2021 14:55:24 <=          
PROJECT\File 4 - A only.txt                16/04/2021 12:06:47 <=           
PROJECT\SubDir1\File 1.2 - A is newest.txt 16/04/2021 15:35:26 <=           
PROJECT\SubDir1\File 1.4 - A only.txt      16/04/2021 12:06:47 <=           

Server B Items of Interest:         
PROJECT\File 3 - B is newest.txt           16/04/2021 12:06:31 =>           
PROJECT\SubDir1\File 1.3 - B is newest.txt 16/04/2021 14:55:13 =>

我已尝试过滤比较对象结果,但找不到合适的条件:

$ServerAItemsOfInterest = Compare-Object -ReferenceObject $dirAItems -DifferenceObject $dirBItems -Property ProjectDir, LastWriteTime | Where-Object `
{$_.SideIndicator -eq "<=" #-and `
    ($dirBItems.ProjectDir -notcontains $_.ProjectDir -or `
    ($dirBItems.ProjectDir -contains $_.ProjectDir # -and [COMPARE LAST WRITE TIMES SOMEHOW]  ))
}

不确定 powershell v1,但也许这样的方法可行?

$dirA = Get-ChildItem -Path 'C:\Temp\test1'
$dirB = Get-ChildItem -Path 'C:\Temp\test2'

$listA = $dirA | ForEach-Object {
    if ($_.Name -notin $dirB.Name) { return $_ }
    $file = $_
    if ($_.LastWriteTime -gt ( $dirB.Where( { $file.Name -eq $_.Name }) ).LastWriteTime) { return $_ }
}

$listB = $dirB | ForEach-Object {
    if ($_.Name -notin $dirA.Name) { return $_ }
    $file = $_
    if ($_.LastWriteTime -gt ( $dirA.Where( { $file.Name -eq $_.Name }) ).LastWriteTime) { return $_ }
}