我是 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 "=="
是多余的,选择其中一个。