
Tengo un directorio de origen y un directorio de destino. Quiero asegurarme de que todo lo que hay en el directorio de origen tenga la misma antigüedad o sea más nuevo que los elementos del directorio de destino.
¿Cuál es el mejor método en Windows, preferiblemente PowerShell, pero no me opongo a algo como robocopy si es más rápido?
Mi pensamiento inicial es algo como esto:
$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?
Probablemente tenga la información requerida siempre que todos los indicadores laterales apunten en la dirección correcta, por lo que podría usar esto para detectar cambios inesperados en el destino, pero este enfoque no parece obvio y complicado, por lo que me pregunto si hay una mejor manera antes de comenzar. sigue este camino.
(El caso de uso es que nadie debería modificar el destino, excepto a través de una canalización de Devops, pero a veces la gente lo hace, por lo que si hay un archivo nuevo o modificado inesperadamente en el destino, quiero verificarlo desde el principio y finalizar la canalización para realizar una investigación más profunda antes. intentando implementar cualquier archivo)
Respuesta1
Aquí está la estructura de archivos que creé para probar con sus atributos:
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
Hay dos directorios, SRC y DEST, cada uno con 2 archivos. Uno de los archivos (myfile2.txt) tiene un valor diferente de LastWriteTime. Cuando ejecutamos el siguiente código, nos dirá que hay una discrepancia entre SRC y DEST con respecto a ese archivo específicamente y no nos dará ningún comentario sobre los archivos que son iguales.
En el siguiente fragmento, solo cambie los valores de $srcFiles
y $destFiles
para editar sus rutas. No será necesario cambiar nada más.
$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
Después de ejecutar esto, obtendrá un resultado similar al siguiente:
Hash Key Value
---- --- -----
DEST myfile2.txt 8/27/2022 9:58:37 PM
SRC myfile2.txt 8/27/2022 9:59:09 PM
Esto le muestra que el nombre de archivo SRC y DEST tienen LastWriteTime
mensajes de correo diferentes y puede deducir en este caso que alguien editó el archivo SRC para myfile2.txt y es diferente al de dest.