none
помогите разобрать со Скриптом RRS feed

  • Вопрос

  • Добрый день.

    Не могу понять, что не так в моем скрипте.

    то что должен делать скрипт. Брать

    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

Все ответы

  • $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