PowerShell compara LastWriteTime de dos archivos [4 formas]
Usando la propiedad LastWriteTime
Para comparar LastWriteTime de dos archivos en PowerShell:
- Utilice
Get-Itempara obtener artículos. - Utilice el bloque
if-elsepara compararLastWriteTimede ambos archivos.
Utilice el operador -eq:
$fileName1 = Get-Item "E:\Test\file1.txt"
$fileName2 = Get-Item "E:\Test\file2.txt"
if ($fileName1.LastWriteTime -eq $fileName2.LastWriteTime) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is same."
}
elseif ($fileName1.LastWriteTime -gt $fileName2.LastWriteTime) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' is greater than '$($fileName2.Name)'"
}
else{
Write-Host "The LastWriteTime of the '$($fileName1.Name)' is greater lesser '$($fileName2.Name)'"
}PRODUCCIÓN :
The LastWriteTime of the 'file1.txt' is greater than 'file2.txt'Usando el cmdlet Compare-Object
Para comparar el LastWriteTime de dos archivos en PowerShell:
- Utilice
Get-Itempara obtener artículos. - Utilice el cmdlet
Compare-Objectpara comparar elLastWriteTimede dos archivos en PowerShell. - Utilice el bloque
if-elsepara determinar si elLastWriteTimede ambos archivos es el mismo.
Utilice el cmdlet Comparar objetos:
$fileName1 = Get-Item "E:\Test\file1.txt"
$fileName2 = Get-Item "E:\Test\file2.txt"
$fileComparison = Compare-Object -ReferenceObject $fileName1.LastWriteTime -DifferenceObject $fileName2.LastWriteTime
if ($fileComparison -eq $null) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is same."
} else {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is different."
}PRODUCCIÓN :
The LastWriteTime of the 'file1.txt' and 'file2.txt' is different.Primero, utilizamos el cmdlet Get-Item para obtener elementos en la ubicación dada y los almacenamos en las variables $fileName1 y $fileName2. Este cmdlet se usa para obtener elementos solo de la ubicación especificada, no su contenido, a menos que usemos un carácter comodín (*) para solicitar el contenido completo de un elemento. Tenga en cuenta que los proveedores de PowerShell utilizan este cmdlet para recorrer varios tipos de almacenes de datos.
Luego, usamos el cmdlet Compare-Object para comparar el LastWriteTime de $fileName1 y $fileName2 y lo guardamos en $fileComparison. variable. Este cmdlet se usa para comparar dos conjuntos de objetos en PowerShell. Aquí, el primer conjunto de objetos es ReferenceObject, mientras que el segundo conjunto de objetos es DifferenceObject. En nuestro caso, $fileName1.LastWriteTime es la reference y $fileName2.LastWriteTime es la Diferencia.
El Compare-Object revisa los métodos disponibles que se pueden utilizar para comparar el objeto completo; si no puede encontrar ningún método apropiado, entonces se utilizará ToString() para comparar los resultados de las cadenas. Al usar este cmdlet, podemos proporcionar una o varias propiedades que se pueden usar para realizar una comparación.
Cuando se especifican propiedades, el cmdlet
Compare-Objectsolo compara los valores de esas propiedades.
El resultado de la comparación representa si la propiedad especificada apareció en DifferenceObject (=>) únicamente o en ReferenceObject (<=) únicamente. Por otro lado, si se utiliza IncludeEqual, entonces el operador == denota que el valor está presente en ambos objetos.
Finalmente, usamos el bloque if-else para comparar $fileComparison con $null usando el -eq ( igual a) operador. Si el valor de la variable $fileComparison es igual a nulo, usamos el cmdlet Write-Host para imprimir un mensaje que dice que LastWriteTime es el mismo. ; por lo demás, diferente.
Recuerde, si el ReferenceObject o el DifferenceObject es nulo ($null), entonces Compare-Object generará un error de terminación que dice que no puede vincular el argumento al parámetro DifferenceObject porque es nulo; Vea el siguiente ejemplo para aclarar su concepto.
Utilice el cmdlet Comparar objetos:
$fileName1 = Get-Item "E:\Test\file1.txt"
$fileName2 = $null
$fileComparison = Compare-Object -ReferenceObject $fileName1.LastWriteTime -DifferenceObject $fileName2.LastWriteTime
if ($fileComparison -eq $null) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is same."
} else {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is different."
}
Descripción del error:
Compare-Object: Cannot bind argument to parameter 'DifferenceObject' because it is null.Recibimos el error anterior porque $fileName2 está establecido en nulo ($null).
Uso del cmdlet New-TimeSpan
Para comparar el LastWriteTime de dos archivos en PowerShell:
- Utilice el cmdlet
Get-Itempara obtener elementos de las ubicaciones indicadas. - Utilice el cmdlet
New-TimeSpanpara crear un objetoTimeSpanen PowerShell. - Utilice el bloque
if-elsepara determinar si elLastWriteTimede ambos archivos es igual o diferente.
Utilice el cmdlet New-TimeSpan:
$fileName1 = Get-Item "E:\Test\file1.txt"
$fileName2 = Get-Item "E:\Test\file2.txt"
$lastWriteTimeDifference = New-TimeSpan $fileName1.LastWriteTime $fileName2.LastWriteTime
if ($lastWriteTimeDifference.TotalSeconds -eq 0) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' and '$($fileName2.Name)' is the same."
}
elseif ($fileName1.LastWriteTime -gt 0) {
Write-Host "The LastWriteTime of the '$($fileName1.Name)' is greater than '$($fileName2.Name)'"
}
else{
Write-Host "The LastWriteTime of the '$($fileName1.Name)' is greater lesser '$($fileName2.Name)'"
}PRODUCCIÓN :
The LastWriteTime of the 'file1.txt' is greater than 'file2.txt'Este fragmento de código es similar al primer ejemplo de la sección anterior, donde utilizamos el cmdlet Compare-Object, excepto por dos diferencias. Primero, utilizamos el cmdlet New-TimeSpan; el segundo era tener una expresión diferente en la declaración if. El cmdlet New-TimeSpan se usa para crear un objeto TimeSpan que almacenamos en la variable $lastWriteTimeDifference, que representa un intervalo de tiempo que podemos usar para sumar o restar tiempo del < objetos código>FechaHora.
Si no utilizamos ningún parámetro, el cmdlet
New-TimeSpandevolverá el objetoTimeSpanque indica el intervalo de tiempo de0.
Aquí, utilizamos la declaración if con el operador -eq (igual a) para comparar si el valor de la propiedad TotalSeconds del El objeto $lastWriteTimeDifference es igual a 0. Si es así, se ejecutará el bloque if; de lo contrario, el bloque elseif comprobará si el valor de la propiedad TotalSeconds del objeto $lastWriteTimeDifference es mayor que 0 ; de lo contrario se ejecutará lo demás.
Supongamos que tenemos n número de archivos en una ubicación particular y queremos comparar el LastWriteTime de un archivo con el resto de los archivos. Luego, podemos utilizar el siguiente enfoque para satisfacer las necesidades del proyecto.
Usando el cmdlet Get-ItemProperty
Para comparar el LastWriteTime de dos archivos en PowerShell:
- Utilice el cmdlet
Get-ChildItempara obtener elementos/elementos secundarios de la ubicación determinada. - Utilice el cmdlet Where-Object para filtrar los objetos recibidos del cmdlet
Get-ChildItem. - Guarde el primer objeto de archivo y su
LastWriteTimeen dos variables separadas. - Utilice el bucle
foreachpara iterar sobre todos los objetos filtrados. -
En cada iteración:
- Utilice el cmdlet
Get-ItemPropertypara obtener la propiedadlastwritetimede un elemento específico.
- Utilice el cmdlet
- Utilice bloques
if-elsecon los operadores de comparación-gty-ltpara compararLastWriteTime. - Utilice el cmdlet
Write-Outputpara imprimir si la última hora de escritura del primer archivo es la misma, anterior o posterior al archivo actual.
Utilice el cmdlet Get-ItemProperty:
$source = "E:\Test"
$allFiles =Get-ChildItem $source | Where-Object { !$_.PSIsContainer }
$firstFile = $allFiles[0]
$firstFileLastWriteTime = [datetime](Get-ItemProperty -Path $firstFile.FullName -Name LastWriteTime).LastWriteTime
foreach ($file in $allFiles) {
$dateTime = [datetime](Get-ItemProperty -Path $file.FullName -Name LastWriteTime).lastwritetime
if ($dateTime -gt $firstFileLastWriteTime) {
Write-Output "$($file.Name) - Last Write Time is newer than $($firstFile.Name)"
} elseif ($dateTime -lt $firstFileLastWriteTime) {
Write-Output "$($file.Name) - Last Write Time is older than $($firstFile.Name)"
} else {
Write-Output "$($file.Name) - Last Write Time is the same as $($firstFile.Name)"
}
}PRODUCCIÓN :
computersList.txt - Last Write Time is the same as computersList.txt
file - Copy.doc - Last Write Time is older than computersList.txt
file - Copy.pdf - Last Write Time is newer than computersList.txt
file.docx - Last Write Time is older than computersList.txt
file.pdf - Last Write Time is newer than computersList.txt
file2.txt - Last Write Time is older than computersList.txt
file3.txt - Last Write Time is older than computersList.txt
file4.txt - Last Write Time is older than computersList.txt
testPS.ps1 - Last Write Time is newer than computersList.txtPrimero, definimos e inicializamos una variable llamada $source con la ruta de la ubicación de origen, que es E:\Test en nuestro caso. A continuación, utilizamos el cmdlet Get-ChildItem para recuperar los elementos en las ubicaciones especificadas, que es $source en el ejemplo anterior. Recuerde, Get-ChildItem puede obtener elementos y elementos secundarios del directorio y subdirectorios dados y los devuelve como System.IO.FileInfo y System.IO. Objetos DirectoryInfo.
Como solo nos interesan los archivos y no queremos sumergirnos en los directorios o subdirectorios, utilizamos el cmdlet Where-Object para filtrar y seleccionar aquellos objetos que no son contenedores (directorios). ¿Cómo? Entendámoslo. En la expresión { !$_.PSIsContainer }, {} representa el bloque de secuencia de comandos, $_ representa el objeto actual en la canalización , y ! se utiliza para negar el valor de la propiedad PSIsContainer. Significa que Where-Object filtrará todos los contenedores y seleccionará solo aquellos objetos que no sean contenedores. Luego, almacenamos los valores resultantes en la variable $allFiles.
Después de eso, recuperamos el primer archivo usando $allFiles[0] y lo almacenamos en la variable $firstFile. También almacenamos el LastWriteTime del $firstFile en la variable $firstFileLastWriteTime.
A continuación, utilizamos el bucle foreach para iterar sobre $allFiles. En cada iteración, utilizamos el cmdlet Get-ItemProperty para obtener las propiedades del elemento actual; en el código anterior, obtuvimos la propiedad lastwritetime, convertimos su tipo a DATETIME usando [datetime] y lo almacenamos en $fechaHora variable. Después de eso, usamos bloques if-else con los operadores -gt y -lt para comparar el LastWriteTime del $firstFile con la hora de última escritura del elemento actual y verificó si es anterior, igual o más reciente que la hora de última escritura del primer archivo.
En cada bloque condicional, utilizamos el cmdlet Write-Output para imprimir el nombre del elemento actual (el nombre del archivo) y describimos si la última hora de escritura es la misma, anterior o posterior a computersList.txt. que fue nuestro primer archivo. Podemos usar la siguiente solución si desea el Mode, LastWriteTime, Length y Name de todos los archivos. en la ubicación especificada.
Usando el comando ls
Utilice el comando ls para enumerar el LastWriteTime de varios archivos en la ubicación especificada cuyo LastWriteTime sea superior a un día.
Utilice el comando ls:
ls | where-object {(new-timespan $_.LastWriteTime).days -ge 1}PRODUCCIÓN :
Directory: E:\Test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2/8/2023 9:26 PM 196 file1.txt
-a---- 2/8/2023 9:31 PM 83 file2.txt
-a---- 2/18/2023 12:18 PM 82 file3.txtYa hemos aprendido todos los comandos utilizados en este ejemplo. Es posible que vea ls como un comando nuevo, pero es un alias del cmdlet Get-ChildItem que ya se explicó en la sección anterior. ls recuperó todos los archivos y subdirectorios en el directorio actual que se reenviaron al cmdlet Where-Object mediante la canalización (|), donde Where-Object los filtró según la propiedad LastWriteTime.
Ya hemos aprendido que el cmdlet New-TimeSpan crea un objeto TimeSpan; aquí, su propiedad Days denota el número de días completos en un lapso de tiempo. La expresión precedida por el cmdlet Where-Object determina si la propiedad Days del objeto TimeSpan es mayor o igual que 1, lo que significa que el elemento actual se escribió por última vez hace más de un día. Si esta expresión es True, el elemento actual se agregará a la salida.
Si solo está interesado en obtener Día, Fecha y Hora, podemos usar ls de la siguiente manera.
Utilice el comando ls:
$source = "E:\Test"
(ls $source).LastWriteTimePRODUCCIÓN :
Wednesday, February 8, 2023 9:26:59 PM
Wednesday, February 8, 2023 9:31:21 PM
Saturday, February 18, 2023 12:18:35 PMPodemos hacer diferentes comparaciones en todos los ejemplos anteriores según las necesidades de nuestro proyecto, como
-gt(mayor que),lt(menor que),-ge(mayor o igual que) o-le(menor o igual que).
Se trata de comparar PowerShell con LastWriteTime de dos archivos.
