Powershell 脚本用于比较两个文件夹并将相同的项目复制到其他文件夹中

Powershell 脚本用于比较两个文件夹并将相同的项目复制到其他文件夹中

我是 powershell 新手,在学习了一些教程后,我根据自己的需求编写了一些代码。但输出结果不如预期。请帮助我。

要求:

我有2个文件夹A和B。

文件夹 A 中出现了新文件,并且目录和子目录中有一些变化。

文件夹 B 中有一些带有目录和子目录的旧的/现有的文件。

我需要完全比较文件夹 A 和文件夹 B 中具有相同名称的文件(包括目录和子目录),然后将两个文件夹中相同的文件从文件夹 B 复制到具有正确目录结构的文件夹 C。

如果新文件存在于文件夹 A 中但不存在于文件夹 B 中,我们可以忽略。

我使用过的代码:

$folderA= \\share\newfiles

$folderB= D:\apps\Existingfiles

$folderC = \\share2\backup

$source1 = (Get-ChildItem -path $folderA)

$dest1 = (Get-ChildItem -path $folderB)

Compare-Object -ReferenceObject $dest1  -DifferenceObject $source1 -Property Name,Length -ExcludeDifferent -IncludeEqual|Where-Object {$_.SideIndicator -eq "=="} | 
    ForEach-Object {
        Copy-Item "$dest\$($_.Name)" -Destination $backup -Recurse -force
    } 

答案1

为了具有可比性,您需要从 FullName 中$source1/$dest1去除前缀​​并将其存储为新的(计算的)属性。$folderA/$folderB

这个新属性将保存子树部分和名称(--> $SubName)。

为了更好地理解,我选择了其他变量名。

## Q:\Test\2018\10\29\SU_1370677.ps1

$RefBase  = 'K:\Bat\'   #  'D:\apps\Existingfiles\'
$DiffBase = 'C:\Bat\'   #  '\\share\newfiles\'
$Target   = 'A:\Bat\'   #  '\\share2\backup\'

$RefTree = Get-ChildItem $RefBase -File -Recurse | Select-Object Length,
           @{n='SubName';e={$_.FullName.Replace($RefBase,'')}}

$DiffTree =  Get-ChildItem $DiffBase -File -Recurse | Select-Object Length,
           @{n='SubName';e={$_.FullName.Replace($DiffBase,'')}}

Compare-Object -ReferenceObject  $RefTree `
               -DifferenceObject $DiffTree `
               -Property SubName,Length `
               -ExcludeDifferent `
               -IncludeEqual | Where-Object SideIndicator -eq "==" |
    ForEach-Object {
        $SourceFile = Join-Path  $DiffBase $_.SubName
        $TargetFile = Join-Path  $Target   $_.SubName
        $TargetDir  = Split-Path $TargetFile -Parent
        If (!(Test-Path $TargetDir)){MD $TargetDir | Out-Null}
        Copy-Item $SourceFile -Destination $TargetFile -Force
    }

BTW-ExcludeDifferent -IncludeEqual | Where-Object SideIndicator -eq "=="是多余的,选择其中一个。

相关内容