【问题标题】:Comparison of two directories两个目录的比较
【发布时间】:2020-01-18 18:41:44
【问题描述】:

我有一个脚本,它会比较两个非常相似的目录,看看哪个目录有更新、更新的文件。这两个路径具有相同的文件,但路径名称的位置略有不同。这两个文件夹的文件数量大致相同,可能比另一个少两三个。

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

【问题讨论】:

  • 遍历每个目录并为每个文件构建一个 hash/crc/SHA256。然后比较哈希值,每边额外/不同的哈希值是感兴趣的文件。见Get-FileHash
  • $outdatedFiles = Compare-Object (gci $path1) -DifferenceObject (gci $path2) -Property LastWriteTime -PassThru | Select * | Out-GridView 可能是一个更简单的解决方案。
  • 如果存在具有不同扩展名的类似文件,例如 program.exe 和 program.config,请使用 .Name 而不是 .BaseName
  • Here's another SO question 这并不完全是重复的,但如果您沿着 Compare-Object 路线走下去可能会有所帮助。
  • @RichMoss 我发现了我原来的问题。我有多个文件具有相似的路径以及完全相同的文件名和扩展名。该脚本正在比较这些而不是其他目录中的对应项。我该如何避免这种情况?

标签: powershell directory comparison operators


【解决方案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
}

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多