2009-06-19 27 views
14

Necesito una secuencia de comandos de PowerShell que pueda acceder a las propiedades de un archivo y descubrir la propiedad LastWriteTime y compararla con la fecha actual y devolver la diferencia de fecha.Simple PowerShell LastWriteTime comparar

tengo algo como esto ...

$writedate = Get-ItemProperty -Path $source -Name LastWriteTime 

... pero no puedo emitir el LastWriteTime a un tipo de datos "DateTime". Dice: "No se puede convertir "@ {LastWriteTime = ... fecha ...}" a "System.DateTime".

Respuesta

18

intente lo siguiente.

$d = [datetime](Get-ItemProperty -Path $source -Name LastWriteTime).lastwritetime 

esto es parte de la rareza propiedad del elemento . Cuando se ejecuta Get-ItemProperty que no devuelve el valor, sino que la propiedad que usted tiene que utilizar un nivel más de indirección para llegar al valor

+0

Eso funciona! ¡Gracias! –

+1

Funcionable, pero innecesariamente opaco, detallado y redundante. Ver mi alternativa – brianary

+2

Esto funcionó para mí, pero como señaló brianary es un poco detallado. No veo el motivo de la parte "-Name LastWriteTime" y funciona sin ese parámetro.Usé esto en su lugar: '[datetime] (Get-ItemProperty -Path $ source). LastWriteTime' –

2

uso

ls |..% {(get-date) - $ _. LastWriteTime}

Puede funcionar para recuperar el diff. Puede reemplazar ls con un solo archivo.

+0

¡El diff funciona! ¡Gracias! –

11
(ls $source).LastWriteTime 

("LS", "dir", o "GCI" son los alias por defecto para Get-ChildItem.)

4

(Get-Item $source).LastWriteTime es mi forma preferida de hacerlo.

6

Tengo un ejemplo me gustaría compartir

$File = "C:\Foo.txt" 
#retrieves the Systems current Date and Time in a DateTime Format 
$today = Get-Date 
#subtracts 12 hours from the date to ensure the file has been written to recently 
$today = $today.AddHours(-12) 
#gets the last time the $file was written in a DateTime Format 
$lastWriteTime = (Get-Item $File).LastWriteTime 

#If $File doesn't exist we will loop indefinetely until it does exist. 
# also loops until the $File that exists was written to in the last twelve hours 
while((!(Test-Path $File)) -or ($lastWriteTime -lt $today)) 
{ 
    #if a file exists then the write time is wrong so update it 
    if (Test-Path $File) 
    { 
     $lastWriteTime = (Get-Item $File).LastWriteTime 
    } 
    #Sleep for 5 minutes 
    $time = Get-Date 
    Write-Host "Sleep" $time 
    Start-Sleep -s 300; 
} 
4

no me puedo quejar cualquiera de las respuestas aquí por el PO aceptado uno de ellos como resolver su problema. Sin embargo, los encontré defectuosos en un aspecto. Cuando entrega el resultado de la asignación a la variable, contiene numerosas líneas en blanco, no solo la respuesta buscada. Ejemplo:

PS C:\brh> [datetime](Get-ItemProperty -Path .\deploy.ps1 -Name LastWriteTime).LastWriteTime 

Friday, December 12, 2014 2:33:09 PM 



PS C:\brh> 

Soy un fan de dos cosas en cuanto a código, concisión y corrección. Brian tiene el derecho de ser sucinto con la punta del sombrero a Roger Lipscombe, pero ambos pierden la corrección debido a las líneas adicionales en el resultado. Esto es lo que creo que el OP estaba buscando, ya que es lo que me llevó a la meta.

PS C:\brh> (ls .\deploy.ps1).LastWriteTime.DateTime 
Friday, December 12, 2014 2:33:09 PM 

PS C:\brh> 

Tenga en cuenta la falta de líneas adicionales, solo la que utiliza PowerShell para separar las solicitudes. Ahora esto se puede asignar a una variable para comparar o, como en mi caso, guardar en un archivo para su lectura y comparación en una sesión posterior.

1

Un poco más fácil: use el cmdlet new-timespan, que crea un intervalo de tiempo a partir de la hora actual.

ls | where-object {(new-timespan $_.LastWriteTime).days -ge 1} 

muestra todos los archivos no se escriben en la actualidad.

Cuestiones relacionadas