PowerShell Compare-对象过滤

问题描述 投票:0回答:0

尝试从两个源位置和一个目标过滤文件。所有 3 个都包含文件并且非常不匹配。

正确提取位置中的所有文件:

$Source1Files = Get-ChildItem -Path $Source1 -File -Recursive -ErrorAction SilentlyContinue | Where-Object {($_.Extension -ne ",txt") -and ($_.PSIsContainer -eq $False)}
$Source2Files = Get-ChildItem -Path $Source2 -File -Recursive -ErrorAction SilentlyContinue | Where-Object {($_.Extension -ne ",txt") -and ($_.PSIsContainer -eq $False)}
$DestFiles = Get-ChildItem -Path $Dest -File -Recursive -ErrorAction SilentlyContinue | Where-Object {($_.Extension -ne ",txt") -and ($_.PSIsContainer -eq $False)}

现在每个数组都有文件,我想过滤仅抓取最新文件以最终复制到目的地。另外过滤掉目标位置最新或较新的所有文件。

到目前为止,我的解决方案是这样的,但它不断抓取旧文件,但它会过滤所有相同的文件。

$S1files = Compare-Object -ReferenceObject @($Source1Files | Select-Obect) -DifferenceObject @($DestFiles | Select-Object) -Property LastWriteTime -PassThru | Where-Object {$_.SideIndicator -eq '<='}
$S2files = Compare-Object -ReferenceObject @($Source2Files | Select-Obect) -DifferenceObject @($DestFiles | Select-Object) -Property LastWriteTime -PassThru | Where-Object {$_.SideIndicator -eq '<='}

上面就是挂断的地方。然后我会将它们相互比较,只留下尚未到达目的地的最新文件。

我的想法是 $S1files 只会包含源中比目标更新的文件。与 $S2files 相同。

添加回复:

对于所有的拼写错误,我们深表歉意。我试图快速从另一个网络重新输入它。它有点像文件同步,但一次是特定于文件夹的。信息量太多,无法进行完全同步。因此,它通常一次定位 1-50 个文件。它还会在目标位置创建文件夹结构和所有内容,这一点很重要,因为目标位置看起来并不完全相同。这一切都运行得非常完美。这些文件的大小从 3mb 到 500gb 不等,甚至在 100gb 范围内。因此,正在尝试防止过度复制。

为了回答一些问题,专门使用了Select-Object,因为有时候数组为空,会导致错误。

这是一个文件更新脚本。目的地上的文件有 3 种方式;不在那里,旧的,相同的(最新的)。每个来源以及相同的 3 种方式。甚至不要让我开始了解保留旧数据有多么浪费,这是稍后要解决的另一个主题。这些文件被放在源上。然后他们被转移到目的地。有时在目的地,他们会接受 QA/QC 并确定需要重做。因此,将同名文件放在源上。这通常相隔 6 个月左右。

Robocopy 你的想法是行不通的。由于它的编写方式,它还会检查文件 1 到 1。此外,您可能永远不会看到它。 Robocopy 可以破坏 Qtree。我现在已经看到它两次了,这需要完全删除并重新创建共享以及整个文件夹结构和文件。

我不确定如何进行更改以进行检查,但 LastWriteTime 是 $S1files 中的问题吗?正常的 LastWriteTime 看起来像 MM-dd-yyyy HH:mm。是否需要改为yyyyMMddHHmm然后comapred?

arrays powershell filter compare
© www.soinside.com 2019 - 2024. All rights reserved.