web-dev-qa-db-fra.com

Comparaison simple de PowerShell LastWriteTime

J'ai besoin d'un script PowerShell qui peut accéder aux propriétés d'un fichier et découvrir la propriété LastWriteTime et la comparer avec la date actuelle et renvoyer la différence de date.

J'ai quelque chose comme ça ...

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

... mais je ne peux pas convertir le LastWriteTime en un type de données "DateTime". Il dit, "Impossible de convertir" @ {LastWriteTime = ... date ...} "en" System.DateTime ".

19
Steven Rogers

Essayez ce qui suit.

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

Cela fait partie de l'étrangeté de la propriété de l'élément. Lorsque vous exécutez Get-ItemProperty, il ne renvoie pas la valeur mais la propriété. Vous devez utiliser un niveau d'indirection supplémentaire pour obtenir la valeur.

26
JaredPar
(ls $source).LastWriteTime

("ls", "dir" ou "gci" sont les alias par défaut de Get-ChildItem.)

14
brianary

J'ai un exemple que je voudrais partager

$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;
}
6
richbria90

Je ne peux reprocher aucune des réponses ici car le PO a accepté l'une d'elles comme résolvant leur problème. Cependant, je les ai trouvés défectueux à un égard. Lorsque vous affichez le résultat de l'affectation dans la variable, il contient de nombreuses lignes vides, pas seulement la réponse recherchée. Exemple:

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

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



PS C:\brh> 

Je suis fan de deux choses dans le code, la concision et l'exactitude. brianary en a le droit pour la concision avec un coup de chapeau à Roger Lipscombe mais les deux manquent de justesse en raison des lignes supplémentaires dans le résultat. Voici ce que je pense que l'OP recherchait car c'est ce qui m'a permis de franchir la ligne d'arrivée.

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

PS C:\brh> 

Notez le manque de lignes supplémentaires, uniquement celle que PowerShell utilise pour séparer les invites. Maintenant, cela peut être affecté à une variable pour comparaison ou, comme dans mon cas, stocké dans un fichier pour lecture et comparaison dans une session ultérieure.

5
Jack Pines

(Get-Item $source).LastWriteTime est ma façon préférée de le faire.

4
Roger Lipscombe

Un peu plus facile - utilisez le new-timespan applet de commande, qui crée un intervalle de temps à partir de l'heure actuelle.

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

affiche tous les fichiers non écrits aujourd'hui.

3
gbjbaanb

Utilisation

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

Cela peut fonctionner pour récupérer le diff. Vous pouvez remplacer ls par un seul fichier.

2
Raoul Supercopter