Лучший отвечающий
помогите разобрать со Скриптом

Вопрос
-
Добрый день.
Не могу понять, что не так в моем скрипте.
то что должен делать скрипт. Брать
1. последний файл прошлого месяца
2.первый файл текущего
сравнивать с 1 числом месяца 2.файла
Не производиться сравнение.
cls
$path = "C:\Test_script\1"
$nowMonth = (Get-Date).month
$now = (Get-Date).Date
$Date1 = (Get-Date -Day 1).date
$end = $nowMonth -1
$fdate = (Get-Date -Day 1).Date
$lltw = $fdate.AddMonths(-12)
$files = Get-ChildItem $path | Where {!$_.PsIsContainer -and $_.LastWriteTime -lt $now} | Foreach {
if($_.LastWriteTime -lt $lltw) {
Move-Item $_.FullName -Destination $dest
#Remove-Item $_.FullName -Force -Recurse
}
else {
$_
}
}
$gr = $files | Group {$_.BaseName.split("_")[0]}
$gr | Foreach {
# Группируем по месяцам, если в месяце 1 архив, то пропускаем.
# Если больше одного то производим сравнение близости.$_.Group | Group {$_.LastWriteTime.Date.ToString("MMyyyy")} | Where {$_.Count -gt 1} | Foreach {
#получаем первый файл в месяце
$rem = $_.Group | Sort LastWriteTime | Select -First 1
#получаем последний файл в предыдущем месяце.
$rem2 = $_.Group | Where {$_.LastWriteTime.date.AddMonths(-1)} | Sort LastWriteTime | Select -Last 1
#произвожу сравнение близости.
If (($rem.LastWriteTime.Date - $Date1) -lt ($date1 - $rem2.LastWriteTime.Date))
{$notdelete = $rem }
else {
$notdelete = $rem2
}
}
}
#Проверяю что удалиться, именно файл который дальше
$rem | Where {$notdelete -notcontains $_.Name} | Remove-Item -Force -Recurse -WhatIf
С уважением HeartlesSpb.
24 апреля 2014 г. 7:44
Ответы
-
cls #Задаем переменные путей 1 путь где хпраняться архивы #2 место откуда в последсвие будем удалять все ненужное $path = "C:\Test_script\1" #папка сохранёных архивов, туда будут перемещаться архивы которые не попадают в переуд сравнения $d = "C:\Test_script\2" # Задаем переменные дат. # 30 дней назад от текущей даты. $Rdate = (Get-Date).adddays(-30) # Получаем список файлов старше 30 дней $files = Get-ChildItem $path | Where {!$_.PsIsContainer -and $_.LastWriteTime -lt $rdate} # Группируем по названию базы # Группируем файлы в массиве по имени убирая все что правее 4 в имени. $gr = $files | Group {$_.BaseName.split("4")[0]} # после групировке запуская пофайловую проверку. $gr | Foreach { # в группе проверяем удаленность от 1 числа прошлого месяца, пропускаем 1 попавшийся остальные удаляем $_.Group |%{Add-Member -type NoteProperty -InputObject $_ -name Seconds -value $([math]::abs((([datetime]$_.lastwritetime) - ((get-date -day 1).AddMonths(-1).date)).TotalSeconds)) -force} $_.group|sort -Property Seconds|select -Skip 1 | move-item -Destination $d }
С уважением HeartlesSpb.
- Помечено в качестве ответа HeartlesSpb 21 мая 2014 г. 9:30
21 мая 2014 г. 9:30
Все ответы
-
$files = Get-ChildItem $path ....... $gr = $files | Group {$_.BaseName.split("_")[0]} $gr | Foreach { $x = $_.Group | Sort LastWriteTime $good = @() $bad = @() $good += $x[0,-1] for($i=1;$i -lt $x.count - 2;$i++) { $t1 = $x[$i].LastWriteTime if($x[$i+2]) { $t2 = $x[$i+1].LastWriteTime $t3 = $x[$i-1].LastWriteTime } if($t1.ToString("dd") -ne "01" -and $t2.ToString("dd") -ne "01") { if($t1.ToString("MMyyyy") -ne $t2.ToString("MMyyyy")) { $t2f = $t2 - (Get-Date $t2.ToString("01.MM.yyyy")) $t1f = (Get-Date $t2.ToString("01.MM.yyyy")) - $t1 if ($t1f -gt $t2f) { $bad += $x[$i] $good += $x[$i+1] } else { $bad += $x[$i+1] $good += $x[$i] } } if($t1.ToString("MMyyyy") -ne $t2.ToString("MMyyyy") -and $t1.ToString("MMyyyy") -ne $t3.ToString("MMyyyy")) { $good += $x[$i] } if($t1.ToString("MMyyyy") -eq $t2.ToString("MMyyyy") -and $t1.ToString("MMyyyy") -ne $t3.ToString("MMyyyy")) { $good += $x[$i] } if($t1.ToString("MMyyyy") -eq $t2.ToString("MMyyyy") -and $good -contains $x[$i]) { $bad += $x[$i+1] } if($t1.ToString("MMyyyy") -eq $t2.ToString("MMyyyy") -and $bad -contains $x[$i]) { $bad += $x[$i+1] } } else { if($t1.ToString("MMyyyy") -ne $t2.ToString("MMyyyy") -and $t1.ToString("MMyyyy") -ne $t3.ToString("MMyyyy")) { $good += $x[$i] } $good += $x[$i+1] } } Write-Host "$('='*40)" Write-Host "База - $($_.Name)" -ForegroundColor Yellow Write-Host "$('='*40)" Write-Host "Хорошие файлы" Write-Host "$('='*40)" Write-Host "$($good | Out-String)" -ForegroundColor Green Write-Host "$('='*40)" Write-Host "Файлы к перемещению" Write-Host "$('='*40)" Write-Host "$($bad | Out-String)" -ForegroundColor Red }
Вывод:
Файлы для сравнения: PS > $x 01012014 30012014 02022014 07022014 09022014 01032014 20032014 27042014 Вывод: ======================================== База - ======================================== Хорошие файлы ======================================== 01012014 27042014 02022014 02022014 01032014 20032014 ======================================== Файлы к перемещению ======================================== 30012014 07022014 09022014
- Предложено в качестве ответа Denis DyagilevEditor 25 апреля 2014 г. 5:22
24 апреля 2014 г. 9:57Отвечающий -
у меня ошибка :(
Unable to index into an object of type System.IO.FileInfo.
At C:\Documents and Settings\Зобков_м_с\Local Settings\Temp\c73cb43c-8e90-468c-ae49-d465ff59b4ff.ps1:15 char:14
+ $good += $x[ <<<< 0,-1]
+ CategoryInfo : InvalidOperation: (System.Object[]:Object[]) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndexС уважением HeartlesSpb.
24 апреля 2014 г. 13:48 -
у меня ошибка :(
Unable to index into an object of type System.IO.FileInfo.
At C:\Documents and Settings\Зобков_м_с\Local Settings\Temp\c73cb43c-8e90-468c-ae49-d465ff59b4ff.ps1:15 char:14
+ $good += $x[ <<<< 0,-1]
+ CategoryInfo : InvalidOperation: (System.Object[]:Object[]) [], RuntimeException
+ FullyQualifiedErrorId : CannotIndex
С уважением HeartlesSpb.
Значит в переменной $x только 1 элемент.25 апреля 2014 г. 5:15Отвечающий -
Распиши по подробнее что в скрипте происходит потому как результат не понятен.
С уважением HeartlesSpb.
25 апреля 2014 г. 5:26 -
Распиши по подробнее что в скрипте происходит потому как результат не понятен.
Приведите вывод всех имен файлов, которые надо сравнить.
С уважением HeartlesSpb.
25 апреля 2014 г. 5:48Отвечающий -
Распиши по подробнее что в скрипте происходит потому как результат не понятен.
С уважением HeartlesSpb.
Приведите вывод всех имен файлов, которые надо сравнить.
StroyOtdel_db_201403300420.rar
StroyOtdel_db_201312310422.rar
StroyOtdel_db_201401020447.rar
Volosovo_IP_db_201312280537.rar
Volosovo_IP_db_201403310316.rar
Volosovo_IP_db_201401030547.rar
С уважением HeartlesSpb.
25 апреля 2014 г. 6:07 -
И какой же результат должен быть для этих файлов?25 апреля 2014 г. 6:20Отвечающий
-
И какой же результат должен быть для этих файлов?
Должны остаться
StroyOtdel_db_201312310422.rar (этот потому что он ближе к 1 чем StroyOtdel_db_201401020447.rar)
StroyOtdel_db_201403300420.rar (этот потому что он единственный, и не с чем сравнивать)
Volosovo_IP_db_201403310316.rar (этот потому что он единственный, и не с чем сравнивать)
Volosovo_IP_db_201401030547.rar(этот потому что он ближе к 1 чем Volosovo_IP_db_201401030547.rar)
С уважением HeartlesSpb.
25 апреля 2014 г. 6:30 -
$gr | Foreach { $x = $_.Group | Sort LastWriteTime $good = @() $bad = @() $t1 = $x[$i].LastWriteTime $t2 = $x[$i+1].LastWriteTime if($t1.ToString("dd") -ne "01" -and $t2.ToString("dd") -ne "01") { if($t1.AddMonths(1).ToString("MMyyyy") -eq $t2.ToString("MMyyyy")) { $t2f = $t2 - (Get-Date $t2.ToString("01.MM.yyyy")) $t1f = (Get-Date $t2.ToString("01.MM.yyyy")) - $t1 if ($t1f -gt $t2f) { $bad += $x[$i] $good += $x[$i+1] } else { $bad += $x[$i+1] $good += $x[$i] } } else { $good += $x[$i+1] } } else { if($t1.ToString("dd") -eq "01") { $good += $x[$i] } else { $good += $x[$i+1] } } Write-Host "$('='*40)" Write-Host "База - $($_.Name)" -ForegroundColor Yellow Write-Host "$('='*40)" Write-Host "Хорошие файлы" Write-Host "$('='*40)" Write-Host "$($good | Out-String)" -ForegroundColor Green Write-Host "$('='*40)" Write-Host "Файлы к перемещению" Write-Host "$('='*40)" Write-Host "$($bad | Out-String)" -ForegroundColor Red }
25 апреля 2014 г. 7:29Отвечающий -
cls #Задаем переменные путей 1 путь где хпраняться архивы #2 место откуда в последсвие будем удалять все ненужное $path = "C:\Test_script\1" #папка сохранёных архивов, туда будут перемещаться архивы которые не попадают в переуд сравнения $d = "C:\Test_script\2" # Задаем переменные дат. # 30 дней назад от текущей даты. $Rdate = (Get-Date).adddays(-30) # Получаем список файлов старше 30 дней $files = Get-ChildItem $path | Where {!$_.PsIsContainer -and $_.LastWriteTime -lt $rdate} # Группируем по названию базы # Группируем файлы в массиве по имени убирая все что правее 4 в имени. $gr = $files | Group {$_.BaseName.split("4")[0]} # после групировке запуская пофайловую проверку. $gr | Foreach { # в группе проверяем удаленность от 1 числа прошлого месяца, пропускаем 1 попавшийся остальные удаляем $_.Group |%{Add-Member -type NoteProperty -InputObject $_ -name Seconds -value $([math]::abs((([datetime]$_.lastwritetime) - ((get-date -day 1).AddMonths(-1).date)).TotalSeconds)) -force} $_.group|sort -Property Seconds|select -Skip 1 | move-item -Destination $d }
С уважением HeartlesSpb.
- Помечено в качестве ответа HeartlesSpb 21 мая 2014 г. 9:30
21 мая 2014 г. 9:30