Beste Methode zum Überprüfen eines Zielverzeichnisses auf neuere Dateien als ein Quellverzeichnis

Beste Methode zum Überprüfen eines Zielverzeichnisses auf neuere Dateien als ein Quellverzeichnis

Ich habe ein Quellverzeichnis und ein Zielverzeichnis. Ich möchte sicherstellen, dass alles im Quellverzeichnis entweder gleich alt oder neuer ist als die Elemente im Zielverzeichnis.

Was ist die beste Methode unter Windows? Am besten Powershell, aber ich habe nichts gegen etwas wie Robocopy, wenn es schneller ist.

Mein erster Gedanke ist, dass es so etwas sein könnte:

$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?

Verfügt wahrscheinlich über die erforderlichen Informationen, solange alle Seitenindikatoren in die richtige Richtung zeigen, sodass ich dies verwenden könnte, um unerwartete Änderungen am Ziel zu erkennen. Dieser Ansatz scheint jedoch nicht offensichtlich und kompliziert, sodass ich mich frage, ob es einen besseren Weg gibt, bevor ich diesen Weg einschlage.

(Der Anwendungsfall besteht darin, dass niemand das Ziel ändern sollte, außer über eine DevOps-Pipeline. Manchmal wird dies jedoch getan. Wenn also im Ziel eine unerwartet geänderte oder neue Datei vorhanden ist, möchte ich dies im Voraus prüfen und die Pipeline zur weiteren Untersuchung beenden, bevor ich versuche, irgendwelche Dateien bereitzustellen.)

Antwort1

Hier ist die Dateistruktur, die ich zum Testen mit ihren Attributen erstellt habe:

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

Es gibt zwei Verzeichnisse, SRC und DEST, jedes mit zwei Dateien. Eine der Dateien (myfile2.txt) hat einen anderen LastWriteTime-Wert. Wenn wir den folgenden Code ausführen, wird uns mitgeteilt, dass es speziell für diese Datei eine SRC- und DEST-Nichtübereinstimmung gibt, und es wird keine Rückmeldung zu den Dateien gegeben, die gleich sind.

Ändern Sie im folgenden Snippet nur die Werte von $srcFilesund , $destFilesum Ihre Pfade zu bearbeiten. Sonst muss nichts geändert werden.

$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

Nachdem Sie dies ausgeführt haben, erhalten Sie ein Ergebnis, das wie folgt aussieht:

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

Dies zeigt Ihnen, dass die Dateinamen SRC und DEST unterschiedliche LastWriteTimeEndungen haben, und Sie können in diesem Fall daraus schließen, dass jemand die SRC-Datei für myfile2.txt bearbeitet hat und sie sich von der in dest unterscheidet.

verwandte Informationen