我有一个源目录和一个目标目录。我想确保源目录中的所有内容与目标目录中的项目相同或更新。
在 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 中的文件不同。