Простое сравнение PowerShell LastWriteTime

Мне нужен PowerShell script, который может получить доступ к свойствам файла и узнать свойство LastWriteTime и сравнить его с текущей датой и вернуть разницу дат.

У меня есть что-то вроде этого...

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

... но я не могу использовать LastWriteTime для типа данных DateTime. В нем говорится: "Невозможно преобразовать" @{LastWriteTime =... date...} "в" System.DateTime ".

Ответы

Ответ 1

Попробуйте следующее.

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

Это часть странности свойств элемента. Когда вы запустите Get-ItemProperty, он не возвращает значение, а вместо этого свойство. Вы должны использовать еще один уровень косвенности, чтобы добраться до значения.

Ответ 2

(ls $source).LastWriteTime

( "ls", "dir" или "gci" являются псевдонимами по умолчанию для Get-ChildItem.)

Ответ 3

У меня есть пример, который я хотел бы поделиться

$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

(Get-Item $source).LastWriteTime - мой предпочтительный способ сделать это.

Ответ 5

Я не могу винить ни один из ответов здесь, когда OP принял один из них как решение своей проблемы. Тем не менее, я обнаружил, что они ошибочны в одном отношении. Когда вы выводите результат присваивания переменной, он содержит множество пустых строк, а не только искомый ответ. Пример:

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

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



PS C:\brh> 

Я поклонник двух вещей в коде, лаконичности и правильности. Брианари имеет право на это, чтобы сцепиться с кончиком шляпы Роджеру Липскомб, но оба ошибаются в правильности из-за дополнительных линий в результате. Вот что я думаю, что OP искал, так как это привело меня к финишу.

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

PS C:\brh> 

Обратите внимание на отсутствие дополнительных строк, только тот, который PowerShell использует для разделения запросов. Теперь это может быть присвоено переменной для сравнения или, как в моем случае, сохранено в файле для чтения и сравнения в более позднем сеансе.

Ответ 6

Использование

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

Он может работать, чтобы получить diff. Вы можете заменить ls на один файл.

Ответ 7

Чуть проще - используйте командлет new-timespan, который создает временной интервал с текущего времени.

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

показывает все файлы, не написанные на сегодняшний день.