Копирование файлов, если дата создания больше последней резервной копии

#powershell

#powershell

Вопрос:

У меня возникли некоторые проблемы с написанным мной скриптом — я пытаюсь выполнить цикл выполнения этой части скрипта и найти любые файлы, у которых дата создания больше, чем при последнем запуске резервной копии.

 $auditDate = (Get-Date).AddDays(0)
$lastAudit = Get-Content $auditLog | Select-Object -last 1
$desDir = "E:Backup"
$srcDir = "C:\Data"

foreach ($file in Get-ChildItem $srcDir)
{
    if ($file.CreationTime.Date.toString("dd/MM/yyyy") -gt $lastAudit)
    {  
        Copy-Item $file.FullName $desDir
    }
    {
    }
}
  

В тот момент, когда я запускаю скрипт, я получаю все скопированные файлы в папке.

Есть идеи?

Комментарии:

1. Какой формат $lastAudit ? Если это также не дд / ММ / гггг, вы никогда не получите правильного сравнения. Сравнение дат, отформатированных в виде строк, обычно не работает — сделайте их объектами true date, чтобы их можно было правильно сравнивать!

2. Извините — Add-Content $AuditLog $auditDate. toString(«дд/ ММ/гггг») Выводится в том же формате!

3. Никогда не сравнивайте даты в виде строк — сравнивайте их как даты!

4.Чтобы немного расширить комментарий alroc, я наткнулся на следующую странность. Следующее сравнение работало для меня не так, как ожидалось; If((Get-Date $_.LastWriteTime) -gt (Get-Date $MaxJSDate)) { оно возвращало файлы, где LastWriteTime было равно переменной MaxJSDate. Когда я распечатал две переменные следующим образом: Write-Host $_.LastWriteTime.GetType() Write-Host $MaxJSDate.GetType() я обнаружил, что они оба относятся к типу DateTime. Я переписал неправильный код следующим образом, и теперь он работает идеально; If($_.LastWriteTime -gt $MaxJSDate) {

Ответ №1:

Частично проблема может заключаться в сравнении дат в виде строк. Например:

 #April 12,2011 is greater than July 7, 2014
"12/04/2011" -gt "07/07/2014"
True
#July 7, 2014 is not greater than June 8, 2014
"07/07/2014" -gt "08/06/2014"
False
  

Посмотрим, поможет ли это вообще

 #Not used in your example but why add 0 days to now?
$auditDate = [DateTime]::Now
$lastAudit = Get-Content $auditLog | Select-Object -last 1
$desDir = "E:Backup"
$srcDir = "C:Data"
#Create a datetime object
$lastAuditDate = [DateTime]::Now
#Parse the retrieved timestamp to a datetime object
#note there is an overload for this method if you need to specify culture
if([DateTime]::TryParse($lastAudit,[ref]$lastAuditDate)){
    #Date parsed successfully get all files newer than the parsed date and copy them
    #To exclude directories add a -File to Get-ChildItem
    #To recurse through subdirectories add a -Recurse
    Get-ChildItem $srcdir | Where-Object {$_.CreationTime.Date -gt $lastAuditDate} | ForEach-Object {Copy-Item $_.FullName $desDir}
}else{
    Write-Error "Failed to parse retrieved date"
}
  

Обратите внимание, что если этот каталог большой, использование foreach-объекта с вложенным оператором if может быть быстрее, чем where-объекта.