檢查目標目錄中是否有比來源目錄更新的檔案的最佳方法

檢查目標目錄中是否有比來源目錄更新的檔案的最佳方法

我有一個來源目錄和一個目標目錄。我想確保來源目錄中的所有內容都與目標目錄中的項目相同或更新。

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,並且您可以在這種情況下推斷有人編輯了 myfile2.txt 的 SRC 文件,並且它與 dest 中的文件不同。

相關內容