' new'中每个文件的文件大小比较目录到“旧”中的匹配文件目录

时间:2017-11-02 18:43:29

标签: powershell

我试图比较数组中单个文件的长度,然后将任何可能小于相应新文件的旧文件复制/返回到新目录。

我遇到的问题是如何将每个文件的大小单独与另一个目录中的相应文件进行比较。这是我的代码:

$oldFile = 'C:\Users\Old\Files\Path'
$newFile = 'C:\Users\New\Files\Path'

$newFileLength = foreach ($Elem in $newFiles) {
    $Elem.Length
}

foreach ($Elem in $oldFiles) {
    if ($newFileLength -gt $Elem.Length) {
        Copy-Item $Elem -Destination 'C:\Users\Difference\Directory'
    }
}

导致错误的部分是if条件。我不认为我正确地调用了单个文件大小,而是在调用我的数组中的元素数量。基本上,我需要一种方法来将我收到的新文件与相应的旧文件进行比较,如果新文件较大,则将文件复制到新目录。

1 个答案:

答案 0 :(得分:1)

您的代码中存在多个错误:

  • $oldFile$newFile只是路径字符串,而不是文件集合。
  • 你的循环中使用的变量有一个尾随" s" ($oldFiles$newFiles),因此它们与具有路径字符串($oldFile$newFile)的变量不同。
  • 第一个循环会为$newFileLength填充$newFiles大小的数组。将数组与标量($newFileLength -gt $Elem.Length)进行比较将为您提供数组中大于标量的值的列表。 PowerShell将非空列表解释为$true,将空列表解释为$false,因此如果数组中的大小不超过与数组进行比较的值,则只有条件才会成立。

要将$newFile中文件的各个大小与$oldFile中的相应文件进行比较,您需要在循环内进行比较,而不是在之后的单独循环中

foreach ($elem in Get-ChildItem $newFile) {
    $referenceFile = Join-Path $oldFile $elem.Name
    if (Test-Path -LiteralPath $referenceFile) {
        if ($elem.Length -gt (Get-Item $referenceFile).Length) {
            Copy-Item ...
        }
    }
}