Простое сравнение PowerShell LastWriteTime - PullRequest
19 голосов
/ 19 июня 2009

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

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

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

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

Ответы [ 7 ]

26 голосов
/ 19 июня 2009

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

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

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

15 голосов
/ 01 марта 2011
(ls $source).LastWriteTime

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

6 голосов
/ 18 сентября 2012

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

$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;
}
5 голосов
/ 13 декабря 2014

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

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

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



PS C:\brh> 

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

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

PS C:\brh> 

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

4 голосов
/ 06 января 2012

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

3 голосов
/ 30 ноября 2015

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

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

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

2 голосов
/ 19 июня 2009

Используйте

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...