
我有一個來源目錄和一個目標目錄。我想確保來源目錄中的所有內容都與目標目錄中的項目相同或更新。
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,並且您可以在這種情況下推斷有人編輯了 myfile2.txt 的 SRC 文件,並且它與 dest 中的文件不同。