当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 在 PowerShell 中比较两个文件夹的内容 [2 种方法]

作者:精品下载站 日期:2024-12-14 05:27:20 浏览:13 分类:玩电脑

在 PowerShell 中比较两个文件夹的内容 [2 种方法]


[玩转系统] 在 PowerShell 中比较两个文件夹的内容 [2 种方法]

比较 PowerSHell 中两个文件夹的内容

PowerShell 是一个功能强大的工具,可以帮助系统管理员和 IT 专业人员自动执行日常任务,其中常见的任务之一就是比较两个文件夹的内容。这对于识别两个目录版本之间的差异或查找备份中丢失的文件非常有用。

要进一步进行,了解当前目录中的项目至关重要。例如,此演示的当前目录位于 C:\Test1C:\Test2

  • C:\Test1 包含两个文本文件和文件夹,名为 FolderAFolderB。目录中的项目包括 File1.txtFile2.txt

    • C:\Test1\FolderA - 它包含一个文本文件 (File4.txt)。
  • C:\Test1\FolderB - 它有一个文本文件(File5.txtFile7.txt)。
  • C:\Test2 由两个名为 FolderCFolderD 的文本文件和文件夹组成。该目录中的项目包括 File1.txtFile3.txt

    • C:\Test2\FolderC - 它包含一个文本文件 (File5.txt)。
  • C:\Test2\FolderD - 它还包含一个文本文件 (File6.txt)。
  • 现在您已经了解了目录详细信息,让我们继续学习比较两个文件夹的内容。

    使用 Compare-Object Cmdlet

    使用 compare-object 比较 PowerShell 中的两个文件夹。 compare-object cmdlet 在 PowerShell 中比较两个数据集。

    使用比较对象 Cmdlet:

    $folder1 = "C:\Test1"
    $folder2 = "C:\Test2"
    
    $folder1Items = Get-ChildItem $folder1 -Recurse
    $folder2Items  = Get-ChildItem $folder2 -Recurse
    
    Compare-Object -ReferenceObject $folder1Items -DifferenceObject $folder2Items -Property Name -IncludeEqual

    输出 :

    Name          SideIndicator
    ----          -------------
    File1.txt      ==
    File5.txt      ==
    FolderC        =>
    FolderD        =>
    File3.txt      =>
    File6.txt      =>
    FolderA        <=
    FolderB        <=
    File2.txt      <=
    File4.txt      <=
    File7.txt      <=

    在上面的代码中,我们定义了两个要比较的文件夹:$folder1$folder2。首先,$ 符号在 PowerShell 中创建一个变量。然后,Compare-Object cmdlet 比较两个数据集。

    ReferenceObject (Get-ChildItem $folder1) 指定引用对象和将用作比较基础的数据集。在本例中,我们使用 Get-ChildItem cmdlet 来获取 $folder1 中的文件和目录列表,并以 -Recurse 作为参数并将该列表传递给 Compare-Object cmdlet 的 -ReferenceObject 参数。这告诉 PowerShell 使用 $folder1 中的文件和目录作为比较的参考。

    Compare-Object cmdlet 的 -DifferenceObject 参数告诉 PowerShell 将 $folder2 中的文件和目录与 $folder1 中的文件和目录进行比较。最后,-Property 指定我们要比较的对象的属性。在本例中,我们比较每个文件夹中文件和目录的 Name 属性。

    -IncludeEqual 指定我们要在比较中包含两个文件夹中相同的对象。默认情况下,Compare-Object cmdlet 仅返回引用对象和差异对象之间存在差异的对象。

    此输出表明存在两个文件、三个不同的文件夹,并且两个文件夹之间有一个文件相同。输出中的 SideIndicator 列显示文件或文件夹的唯一侧, 表示右侧,和 == 两者。

    考虑到上述解决方案,PowerShell 中的 Compare-Object cmdlet 提供了一种有效且强大的方法来比较和识别两个数据集之间的差异。通过指定引用和差异对象、我们想要比较的属性以及任何其他选项(例如包括两个数据集中相同的对象),我们可以快速轻松地识别两个文件夹之间的更改。

    使用 MD5 哈希

    要比较两个文件夹的内容:

    • 使用Get-ChildItem 检索指定目录中的所有项目。
    • 使用 Get-FileHash 生成每个文件的 MD5 哈希值。
    • 使用两个 foreach 循环迭代两个目录的哈希值。
    • 在每个循环的每次迭代中:
    • 使用Where-Object 过滤匹配值,并在满足if 语句时打印一条消息。

    使用 MD5 哈希:

    $folder1 = "C:\Test1"
    $folder2 = "C:\Test2"
    $hash1 = Get-ChildItem $folder1 -Recurse | Get-FileHash -Algorithm MD5
    $hash2 = Get-ChildItem $folder2 -Recurse | Get-FileHash -Algorithm MD5
    foreach ($hash in $hash1) {
        $match = $hash2 | Where-Object { $_.Hash -eq $hash.Hash }
        if ($match) {
            Write-Host "File $($hash.Path) exists in both folders and is identical."
        } else {
            Write-Host "File $($hash.Path) exists only in $folder1."
        }
    }
    foreach ($hash in $hash2) {
        $match = $hash1 | Where-Object { $_.Hash -eq $hash.Hash }
        if (!$match) {
            Write-Host "File $($hash.Path) exists only in $folder2."
        }
    }
    File C:\Test1\File1.txt exists in both folders and is identical.
    File C:\Test1\File2.txt exists only in C:\Test1.
    File C:\Test1\FolderA\File4.txt exists in both folders and is identical.
    File C:\Test1\FolderB\File5.txt exists in both folders and is identical.
    File C:\Test1\FolderB\File7.txt exists only in C:\Test1.
    File C:\Test2\File3.txt exists only in C:\Test2.
    File C:\Test2\FolderD\File6.txt exists only in C:\Test2.

    MD5(消息摘要 5)是一种广泛使用的加密哈希函数,它可以从任意长度的消息生成固定长度的128 位哈希值。如前所述,这是代码的逐步解释:

    1. 第一步是设置我们要比较的两个文件夹的路径。我们创建两个变量,$folder1$folder2,并为它们分配这两个文件夹的路径。
    2. 接下来,我们使用 Get-ChildItem cmdlet 检索两个目录中的所有文件,并将输出通过管道传输到 Get-FileHash cmdlet,后者为每个文件生成 MD5 哈希值。生成的哈希值存储在 $hash1$hash2 变量中。
    3. 然后,我们迭代 $hash1 中的每个哈希值并将其与 $hash2 进行比较。我们使用“Where-Object”cmdlet 在 $hash2 中搜索匹配的哈希值,如果找到匹配项,我们会向控制台输出一条消息,指示该文件存在于两个文件夹中,并且是相同的。如果未找到匹配项,我们将输出一条消息,指示该文件仅存在于 $folder1 中。
    4. 然后,我们迭代 $hash2 中的每个哈希值,并检查仅存在于 $folder2 中的文件。接下来,我们使用 Where-Object cmdlet 在 $hash1 中搜索匹配的哈希值,如果未找到匹配项,我们会向控制台输出一条消息,表明该文件仅存在于 $folder2 中。

    考虑到上述解决方案,在 PowerShell 中比较两个文件夹的内容可以成为识别文件内容和结构差异的强大工具。添加 MD5 哈希可以提供更准确的文件比较。使用正确的脚本,即使在大型且复杂的目录结构上,也可以快速轻松地执行此任务。

    这就是如何在 PowerShell 中比较两个文件夹的内容

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯