Скрипт для применения политики хранения резервных копий - PullRequest
0 голосов
/ 25 апреля 2019

Мне нужен сценарий, который может просматривать наши папки резервных копий (мы делаем полные резервные копии машин) и гарантировать, что мы никогда не будем хранить больше двух последних резервных копий для каждого компьютера. В настоящее время я работаю над циклом powershell, который должен сравнивать каждое имя файла с каждым другим файлом в папке резервной копии. На каждой машине есть несколько файлов резервных копий, которые можно идентифицировать по соответствующему префиксу и уникальному идентификационному номеру, разделенному символом-разделителем.

префикс = имя машины и уникальный идентификатор обозначает каждую резервную копию.

Я работаю над настройкой внешней петли и врезаться в стену. Я храню список файлов для проверки в $array.

У меня есть вложенный цикл for, в котором я хочу проверять каждый файл на соответствие каждому другому файлу в массиве. У меня есть запрос, который должен перестроить массив и исключить текущий ссылочный файл каждую итерацию.

for ($i=0; $i -lt 5; $i++) { 

$ array = Get-ChildItem -Path C: \ Users \ Aaron.Trujillo \ Desktop \ test $ array = Get-ChildItem -Path C: \ Users \ Aaron.Trujillo \ Desktop \ test -Exclude $ array [$ i]

for ($j=0; $j -lt 5; $j++){ 
    Write-Host "i: $i  j: $j"
    Write-Host "Array i: $($array[$i].name)  Array j: $($array[$j].name)"

    if($array[$i].name -ne $array[$j].name)
    {
        Write-Host "truthval=false"
        $truthval="false"
    } 

    else
    {
        Write-Host "truthval=true"
        $truthval = "true"
    } 
}  

}

Я ожидал, что этот цикл сравнит первые пять файлов в массиве друг с другом (исключая текущий ссылочный файл) и изменит переменную для каждого файла, но по какой-то причине ссылочный файл не исключается.

Что-то должно быть не так с логикой, но я изо всех сил пытаюсь определить это.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Я вижу несколько недостатков с вашим кодом.

  1. Поскольку $array предположительно заполняется Get-ChildItem (который на отформатированных дисках ntfs возвращает вывод sorted ), вложенные циклы вообще не нужны.
    При итерации с одним просто сравните с предшественником / последователем index +/- 1.

  2. Поскольку имена включают в ваше описание идентификатор, они всегда разные. Таким образом, вы должны разделить имя на туманном разделителе и проверить, совпадает ли имя машины.

  3. ваша команда if ничего не генерирует, она просто перезаписывает одну и ту же переменную на каждой итерации.

С хорошей идеей @ Lee_Dailey по группировке вы можете разделять имена на лету и проверять счетчик по группе, сортировать файлы по группе по LastWriteTime и сохранять только самые новые 2.

Итак, дано гипотетическое дерево файлов

> tree /F
A:.
└───Backup
        Alpha_8.bak
        Bravo_2.bak
        Bravo_5.bak
        Bravo_6.bak
        Bravo_7.bak
        Bravo_9.bak
        Charlie_1.bak
        Charlie_10.bak
        Charlie_3.bak
        Charlie_4.bak

этот маленький скрипт:

$BackupDir = 'A:\Backup'
$Delim     = '_'

Get-ChildItem -Path $BackupDir -File | 
  Group-Object {($_.BaseName -split $Delim)[0]}

выходы:

Count Name                      Group
----- ----                      -----
    1 Alpha                     {Alpha_8.bak}
    5 Bravo                     {Bravo_2.bak, Bravo_5.bak, Bravo_6.bak, Bravo_7.bak...}
    4 Charlie                   {Charlie_1.bak, Charlie_10.bak, Charlie_3.bak, Charlie_4.bak}

Затем вы можете перебирать группы и удалять файлы для каждой группы любым способом,
Например, удалите все файлы, кроме 2-х новейших (определенных для LastWriteTime), для каждого компьютера:

Get-ChildItem -Path $BackupDir -File | 
  Group-Object {($_.BaseName -split $Delim)[0]} | ForEach-Object {
    $_.Group | Sort LastWriteTime -Desc | Select -skip 2 | Remove-Item -WhatIf
  }

Если вывод выглядит нормально, уберите завершающий -WhatIf

0 голосов
/ 25 апреля 2019

Я думаю, это скобки вокруг $array[$j.name], то есть должно быть:

if($array[$i].name -ne $array[$j].name)

Редактировать:

Для устранения неполадок попробуйте вручную вывести свою информацию:

for ($i=0; $i -lt 5; $i++) { 

    for ($j=$i+1; $j -lt 5; $j++){ 
        Write-Host "i: $i  j: $j"
        Write-Host "Array i: $($array[$i].name)  Array j: $($array[$j].name)"

        if($array[$i].name -ne $array[$j].name)
        {
            Write-Host "truthval=false"
            $truthval="false"
        } 

        else
        {
            Write-Host "truthval=true"
            $truthval = "true"
        } 
    }  
}
...