#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-объекта.