Лучший способ проверить целевой каталог на наличие более новых файлов, чем исходный каталог

Лучший способ проверить целевой каталог на наличие более новых файлов, чем исходный каталог

У меня есть исходный каталог и целевой каталог. Я хочу убедиться, что все в исходном каталоге либо того же возраста, либо новее, чем элементы в целевом каталоге.

Какой метод лучше всего использовать в Windows? Предпочтительно PowerShell, но я не против чего-то вроде RoboCopy, если это быстрее.

Моя первая мысль была такой:

$src = Get-ChildItem -Recurse -path C:\temp\src\
$dest = Get-ChildItem -Recurse -path C:\temp\dest\
Compare-Object -ReferenceObject $dest -DifferenceObject $src
## TODO: Check result of Compare-Object and throw error if there's an unexpected change?

Вероятно, будет получена необходимая информация, если все SideIndicators указывают правильное направление, поэтому я мог бы использовать это для обнаружения неожиданных изменений в пункте назначения, но этот подход кажется неочевидным и запутанным, поэтому я задаюсь вопросом, есть ли лучший способ, прежде чем я пойду по этому пути.

(Вариант использования заключается в том, что никто не должен изменять место назначения, кроме как через конвейер DevOps, но иногда люди это делают, поэтому, если в месте назначения есть неожиданно измененный или новый файл, я хочу проверить это заранее и завершить конвейер для дальнейшего изучения, прежде чем пытаться развернуть какие-либо файлы)

решение1

Вот структура файла, которую я создал для тестирования с их атрибутами:

PS C:\> Get-ChildItem C:\temp2\src -recurse

    Directory: C:\temp2\src

Mode                 LastWriteTime         Length Name                                                                                                                           
----                 -------------         ------ ----                                                                                                                           
-a----         8/27/2022   9:58 PM              3 myfile1.txt                                                                                                                    
-a----         8/27/2022   9:59 PM              6 myfile2.txt

PS C:\> Get-ChildItem C:\temp2\dest -recurse

    Directory: C:\temp2\dest

Mode                 LastWriteTime         Length Name                                                                                                                           
----                 -------------         ------ ----                                                                                                                           
-a----         8/27/2022   9:58 PM              3 myfile1.txt                                                                                                                    
-a----         8/27/2022   9:58 PM              3 myfile2.txt

Есть два каталога, SRC и DEST, в каждом из которых по 2 файла. Один из файлов (myfile2.txt) имеет другое значение LastWriteTime. Когда мы запустим приведенный ниже код, он сообщит нам, что есть несоответствие SRC и DEST относительно этого файла, и не даст никакой обратной связи о файлах, которые являются одинаковыми.

В следующем фрагменте измените только значения $srcFilesи $destFilesдля редактирования путей. Больше ничего менять не нужно.

$Results = @()
$srcFiles = Get-ChildItem "C:\temp2\src" -recurse | select Name,LastWriteTime
$destFiles = Get-ChildItem "C:\temp2\dest" -recurse | select Name,LastWriteTime
$srcFileTable = @{}
$destFileTable = @{}

foreach($srcFile in $srcFiles)
{
    $srcFileTable.Add(($srcFile.Name),($srcFile.LastWriteTime))
}
foreach($destFile in $destFiles)
{
    $destFileTable.Add(($destFile.Name),($destFile.LastWriteTime))
}

$srcFileTable.keys | %{
    if ($destFileTable.keys -match $_){
        if (!($destFileTable.$_ -match $srcFileTable.$_)) {
            $Results += new-object psobject -property @{Hash="SRC";Key=$_;Value=$srcFileTable.$_}
        }
    } Else {$Results += new-object psobject -property @{Hash="SRC";Key=$_;Value=$srcFileTable.$_}}
}
$destFileTable.keys | %{
    if ($srcFileTable.keys -match $_){
        if (!($srcFileTable.$_ -match $destFileTable.$_)) {
            $Results += new-object psobject -property @{Hash="DEST";Key=$_;Value=$destFileTable.$_}
        }
    } Else {$Results += new-object psobject -property @{Hash="DEST";Key=$_;Value=$destFileTable.$_}}
}
$Results | select Hash,Key,Value | sort -property Key,Hash | FT

После запуска вы получите результат, который выглядит примерно так:

Hash Key         Value               
---- ---         -----               
DEST myfile2.txt 8/27/2022 9:58:37 PM
SRC  myfile2.txt 8/27/2022 9:59:09 PM

Это показывает, что имена файлов SRC и DEST имеют разные LastWriteTimes, и в этом случае вы можете сделать вывод, что кто-то отредактировал файл SRC для myfile2.txt, и он отличается от файла в dest.

Связанный контент