Search code examples
powershelldirectorycomparisonoperators

Comparison of two directories


I have a script which will compare two very similar directories to see which has newer, updated files. The two paths have the same files but the path names are locations that are slightly different. The two folders have about the same amount of files, maybe two or three less than the other.

$path1 = "E:\docs\training\files"
$path2 = "D:\docs\training - Copy\files"
$outdatedFiles = @()

foreach($file in $Folder1)
{
    foreach($file2 in $Folder2)
    {
        if($file2.BaseName -match $file.BaseName)
        {
            if($file.LastWriteTime -gt $file2.LastWriteTime)
            {
                $Result = "" | Select OutDatedFile,LastWriteTime
                $Result.OutDatedFile = $file2.FullName
                $Result.LastWriteTime = $file2.LastWriteTime
                $outdatedFiles += $Result
            }
        }
    }
}

In the $outdatedFiles array, I get files that are not newer than their counterpart in the other directory. I think it might be due to my comparison in the if statement, I tried -match, -contains, and -ccontains to see if any of these would give me what I wanted. Neither worked. It might be that the foreach doesn't work due to the slightly different amount of files in each folder. Any suggestions?

EDIT

I tried building a hash but this did not find all the updated files:

$outdatedFiles = @()
foreach($file in $Folder1)
{
    foreach($file2 in $Folder2)
    {
        if($file2.Name -like $file.Name)
        {
            #compare hash here
            $Hash2 = Get-FileHash $file2.FullName -Algorithm SHA256
            $Hash1 = Get-FileHash $file.FullName -Algorithm SHA256
            if($Hash2.Hash -ne $Hash1.Hash)
            {
                $Result = "" | Select OutDatedFile,LastWriteTime
                $Result.OutDatedFile = $file2.FullName
                $Result.LastWriteTime = $file2.LastWriteTime
                $outdatedFiles += $Result
            }
        }
    }
}

EDIT

This was my solution

$Differences1 = @()
foreach($file in $Folder1)
{
    foreach($file2 in $Folder2)
    {
        <#Trim path then compare#>
        #File1
        $file1part1 = ($file.FullName).Split("\")[-2]
        $file1part2 = ($file.FullName).Split("\")[-1]
        $newPath1 = $file1part1 + "\" + $file1part2
        #File2
        $file2part1 = ($file2.FullName).Split("\")[-2]
        $file2part2 = ($file2.FullName).Split("\")[-1]
        $newPath2 = $file2part1 + "\" + $file2part2
        if($newPath1 -like $newPath2)
        {
            $Differences1 += Compare-Object (gci $file2.FullName) -DifferenceObject (gci $file.FullName) -Property LastWriteTime -PassThru | Select Name,FullName,LastWriteTime | Sort-Object -Property Name
        }
    }
}
if($Differences1 -ne $null)
{
    $Differences1 | Out-File $textFile -Append
}
else
{
    "No folders have different modified dates" | Out-File $textFile -Append
}

Solution

  • In the end, the solution was more complex than I wanted, or maybe I just made it that way. The problem was I had multiple files with the same name and similar paths, as in the subfolder was named the same. I had to trim the path to be able to get a better comparison:

    $Differences1 = @()
    foreach($file in $Folder1)
    {
        foreach($file2 in $Folder2)
        {
            <#Trim path then compare#>
            #File1
            $file1part1 = ($file.FullName).Split("\")[-2]
            $file1part2 = ($file.FullName).Split("\")[-1]
            $newPath1 = $file1part1 + "\" + $file1part2
            #File2
            $file2part1 = ($file2.FullName).Split("\")[-2]
            $file2part2 = ($file2.FullName).Split("\")[-1]
            $newPath2 = $file2part1 + "\" + $file2part2
            if($newPath1 -like $newPath2)
            {
                $Differences1 += Compare-Object (gci $file2.FullName) -DifferenceObject (gci $file.FullName) -Property LastWriteTime -PassThru | Select Name,FullName,LastWriteTime | Sort-Object -Property Name
            }
        }
    }
    if($Differences1 -ne $null)
    {
        $Differences1 | Out-File $textFile -Append
    }
    else
    {
        "No folders have different modified dates" | Out-File $textFile -Append
    }