两个目录的比较

时间:2019-09-17 21:04:54

标签: powershell directory comparison operators

我有一个脚本,该脚本将比较两个非常相似的目录,以查看其中包含更新的文件。这两个路径具有相同的文件,但是路径名称的位置略有不同。这两个文件夹的文件数量大致相同,可能比另一个少两个或三个。

$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
            }
        }
    }
}

$outdatedFiles数组中,我得到的文件不比其他目录中的文件新。我认为这可能是由于我在if语句中进行的比较所致,我尝试了-match-contains-ccontains来查看是否有任何这些可以满足我的需求。两者都不起作用。 foreach可能由于每个文件夹中的文件数量略有不同而无法使用。有什么建议吗?

编辑

我尝试构建哈希,但是没有找到所有更新的文件:

$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
            }
        }
    }
}

编辑

这是我的解决方法

$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
}

1 个答案:

答案 0 :(得分:1)

最后,解决方案比我想要的还要复杂,或者也许我只是这样做了。 问题是我有多个具有相同名称和相似路径的文件,因为子文件夹中的名称相同。我必须修剪路径才能获得更好的比较:

$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
}