
소스 디렉터리와 대상 디렉터리가 있습니다. 소스 디렉터리의 모든 항목이 대상 디렉터리의 항목과 같거나 최신인지 확인하고 싶습니다.
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?
모든 SideIndicator가 올바른 방향을 가리키는 한 필요한 정보를 얻을 수 있으므로 이를 사용하여 대상의 예상치 못한 변경 사항을 감지할 수 있지만 이 접근 방식은 명확하지 않고 복잡해 보이기 때문에 더 나은 방법이 있는지 궁금합니다. 이 길로 내려가세요.
(사용 사례는 누구도 데브옵스 파이프라인을 통하지 않고 대상을 수정해서는 안 된다는 것입니다. 그러나 때로는 사람들이 그렇게 하기 때문에 대상에 예기치 않게 수정되거나 새 파일이 있는 경우 미리 확인하고 추가 조사를 위해 파이프라인을 종료하고 싶습니다. 파일을 배포하려고 함)
답변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
이 경우 누군가가 myfile2.txt에 대한 SRC 파일을 편집했고 이는 dest의 파일 이름과 다르다는 것을 추론할 수 있습니다.