
У меня есть исходный каталог и целевой каталог. Я хочу убедиться, что все в исходном каталоге либо того же возраста, либо новее, чем элементы в целевом каталоге.
Какой метод лучше всего использовать в 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 имеют разные LastWriteTime
s, и в этом случае вы можете сделать вывод, что кто-то отредактировал файл SRC для myfile2.txt, и он отличается от файла в dest.