none
Скрипт для бэкапа RRS feed

  • Вопрос

  • Доброго времени суток.

    Есть задача для написания скрипта, который бы выполнял подключение к сетевому диску, копировал оттуда данные  в папки, в имени которых будет дата создания копии. В итоге необходимо хранить копии за месяц, а также копировать за 1 и последнее число в месяце в другое расположение. Если за 1 и последнее число нет копий, то ближайшие к ним.

    Получилось все реализовать, как мне кажется, но загвоздка в поиске копий, если отсутствуют за 1 и последнее число в месяце, совсем не представляю как это сделать, поскольку только начал изучать powershell, прошу помощи.

    $date = Get-Date
    $fdate = "{0:dd-MM-yyyy}" -f ($date)
    $dblocation = "D:\Data\DB"
    $username = "Admin"
    $password = Get-Content 'C:\Inst\securestring.txt' | ConvertTo-SecureString
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
    
    New-PSDrive -Name "DB" -PSProvider "FileSystem" -Root "\\172.16.0.200\DB" -Credential $cred
    $Source = "DB:"
    $destination = $dblocation + "\" + $fdate
    
    
    if(!(Test-Path $destination)) {
       
       New-Item -ItemType directory -Path $destination -Force | Out-Null
    
       Copy-Item -Path $Source\*.* -Destination $destination -Force
    
    } else {
       exit
    }
    
    Remove-PSDrive -Name DB
    
    
    $arch = "E:\Archive"
    $Days = [DateTime]::DaysInMonth($date.Year, $date.Month)      # кол-во дней в месяце 
    $firstDate = [DateTime]::new($date.Year, $date.Month, 1)      # 1 число     
    $lastDate  = [DateTime]::new($date.Year, $date.Month, $Days)  # последнее число
    
    if(!(Test-Path $arch)) {
       New-Item -ItemType Directory -Path $arch -Force | Out-Null
    } 
    
    Get-ChildItem -Path $dblocation | Where-Object {(($_.LastWriteTime).Day -eq $firstDate.Day) -or (($_.LastWriteTime).Day -eq $lastDate.Day)} | Copy-Item -Destination $arch
    
    
    $PrevMonth = $firstDate.AddDays(-1) # последнее число предыдущего месяца 
    
    Get-ChildItem -Path $dblocation | Where-Object {(($_.LastWriteTime).Day -le $PrevMonth.Day) -and (($_.LastWriteTime).Month -le $PrevMonth.Month) -and (($_.LastWriteTime).Year -le $PrevMonth.Year)} | Remove-Item -Force



    23 ноября 2019 г. 18:24

Ответы

  • Доброго времени суток.

    В итоге необходимо хранить копии за месяц, а также копировать за 1 и последнее число в месяце в другое расположение. Если за 1 и последнее число нет копий, то ближайшие к ним.

    Получилось все реализовать, как мне кажется, но загвоздка в поиске копий, если отсутствуют за 1 и последнее число в месяце, совсем не представляю как это сделать, поскольку только начал изучать powershell, прошу помощи.

    День добрый.

    Взять первый последний элемент проще отсортировав по дате и взять первый/последний элемент селектом:

    Get-ChildItem -Path $dblocation | Sort-Object LastWriteTime | Select-Object -First 1 -Last 1


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram


    • Изменено Sergey Korotkov 24 ноября 2019 г. 7:27
    • Помечено в качестве ответа Baranov Mikhail 25 ноября 2019 г. 6:49
    24 ноября 2019 г. 7:23

Все ответы

  • вот так я удаляю папки двух недельной давности:

    $date = get-date -DisplayHint date -UFormat %Y-%m-%d
    $twoweeksago = get-date (get-date).addDays(-14) -UFormat %Y-%m-%d
    
    $ChekFolder = "\\server\backup\$twoweeksago"
    $FileExists = Test-Path $ChekFolder
    If ($FileExists -eq $True) {
    rmdir -R \\server\backup\$twoweeksago
    }

    А почему бы Вам не бекапить каждого 1-го числа сразу в другое расположение?

    23 ноября 2019 г. 18:42
  • Доброго времени суток.

    В итоге необходимо хранить копии за месяц, а также копировать за 1 и последнее число в месяце в другое расположение. Если за 1 и последнее число нет копий, то ближайшие к ним.

    Получилось все реализовать, как мне кажется, но загвоздка в поиске копий, если отсутствуют за 1 и последнее число в месяце, совсем не представляю как это сделать, поскольку только начал изучать powershell, прошу помощи.

    День добрый.

    Взять первый последний элемент проще отсортировав по дате и взять первый/последний элемент селектом:

    Get-ChildItem -Path $dblocation | Sort-Object LastWriteTime | Select-Object -First 1 -Last 1


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram


    • Изменено Sergey Korotkov 24 ноября 2019 г. 7:27
    • Помечено в качестве ответа Baranov Mikhail 25 ноября 2019 г. 6:49
    24 ноября 2019 г. 7:23
  • Спасибо за помощь, это именно то что мне нужно
    25 ноября 2019 г. 6:50