создание сценария powershell для резервного копирования файла и добавления даты

В настоящее время у меня есть пакетный файл с одной строкой для резервного копирования файла. Я запускаю его вручную, когда мне нужно сделать резервную копию файла. Единственное, что я хотел бы добавить к нему, это текущая дата. Вот что у меня есть:

xcopy /W /Y ACTIVE.DB ACTIVE.DB.BACKUP

файл назначения должен быть просто ACTIVE.DB.BACKUP.YYYYMMDD. Как мне создать сценарий, который позволит мне дважды щелкнуть по нему из проводника Windows и выполнить xcopy?


person Sam Carleton    schedule 08.09.2010    source источник


Ответы (3)


Вы можете настроить имя файла, внедрив отформатированное [datetime]::now в имя файла в PowerShell следующим образом:

xcopy /W /Y ACTIVE.DB "ACTIVE.DB.BACKUP.$([datetime]::now.ToString('yyyy-MM-dd'))"

Если линия кажется занятой и неподдерживаемой, вы можете преобразовать ее в несколько строк:

$now = [datetime]::now.ToString('yyyy-MM-dd')
xcopy /W /Y ACTIVE.DB "ACTIVE.DB.BACKUP.$now"

Чтобы получить выполнение двойным щелчком, я обычно создаю пакетный файл, который запускает команду PowerShell, как описано здесь:

Настройка сценария PowerShell для автоматического выполнения

person kbrimington    schedule 08.09.2010

Просто чтобы указать, что вы можете сделать это с помощью Copy-Item, например:

Set-Location $path
Copy-Item ACTIVE.DB "ACTIVE.DB.$(get-date -f yyyyMMdd)" -Force -Confirm

Если вам нужна надежность, я бы использовал robocopy.exe.

person Keith Hill    schedule 08.09.2010

В этом месяце я только что создал сценарий ежедневного/еженедельного/ежемесячного/ежеквартального/ежегодного резервного копирования в Powershell и надеюсь, что это поможет.

Этот сценарий резервного копирования DWMQY состоит в том, чтобы заархивировать исходную папку в zip-файл с именем даты, а затем сохранить zip-файлы:

  • последние 7 дней
  • 4 недели (каждая пятница)
  • 6 месяцев (последняя пятница каждого месяца)
  • 4 квартал (последний месяц квартала)
  • 2 года (последний квартал года).

Ежедневно выполняя запланированную задачу, он помещает zip-файлы в целевую папку, которая также является локальной папкой Microsoft OneDrive, поэтому zip-файлы также удаленно синхронизируются с сервером OneDrive. Эти устаревшие (не пятничные ежедневные или не последние DWMQY) zip-файлы будут перемещены в папку без удаленной синхронизации.

Сегодня 5 марта 2016 года, в целевой папке должны быть следующие zip-файлы:

  • 7 дней: 160304-160229-160227
  • 4 недели: 160304, 160226, 160219,160212
  • 6 месяцев: 160226, 160129, 161225, 151127, 151025, 150925
  • 4 квартала: 151225, 150925,150626,150327
  • 2 года: 151225, 141226

Таким образом, будет 23 zip-архива (на самом деле меньше из-за дубликатов среди DWMQY), наши файлы представляют собой 250 текстовых документов, что составляет 0,4 ГБ после сжатия, поэтому всего 23 * 0,4 = 9,2 ГБ, что меньше бесплатной квоты OneDrive в 15 ГБ.

Для больших исходных данных можно использовать 7-zip, который обеспечивает максимальный размер zip-архива 16 mil ТБ. Для прямого резервного копирования папок вместо zip не пробовал. Предполагаю, что это переносимая процедура из текущего почтового пути.

# Note: there are following paths:
# 1. source path: path to be backed up. 
# 2. target path: current zips stored at, which is also a remote-sync pair's local path.
# 3. moved-to path: outdated zips to be moved in this non-sync'able location.
# 4. temp path: to copy the source file in to avoid zip.exe failing of compressing them if they are occupied by some other process.
# Function declaration
. C:\Source\zipSaveDated\Functions.ps1 
# <1> Zip data
$sourcePath = '\\remoteMachine1\c$\SourceDocs\*'
$TempStorage = 'C:\Source\TempStorage'
$enddate = (Get-Date).tostring("yyyyMMdd")
$zipFilename = '\\remoteMachine2\d$\DailyBackupRemote\OneDrive\DailyBackupRemote_OneDrive\' + $enddate + '_CompanyDoc.zip'
Remove-Item ($TempStorage + '\*') -recurse -Force
Copy-Item $sourcePath $TempStorage -recurse -Force

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory($TempStorage, $zipFilename) 

# <2> Move old files
$SourceDir = "\\remoteMachine2\d$\DailyBackupRemote\OneDrive\DailyBackupRemote_OneDrive"
$DestinationDir = "\\remoteMachine2\d$\DailyBackupRemote\bak" # to store files moved out of the working folder (OneDrive)
$KeepDays = 7
$KeepWeeks = 4
$KeepMonths = 6
$KeepQuarters = 4
$KeepYears = 2
# <2.1>: Loop files
$Directory = $DestinationDir
if (!(Test-Path $Directory))
{
    New-Item $directory -type directory -Force
}
$files = get-childitem $SourceDir *.*
foreach ($file in $files) 
{ # L1
    # daily removal will not remove weekly copy, 7 
    If($file.LastWriteTime -lt (Get-Date).adddays(-$KeepDays).date  `
        -and $file.LastWriteTime.DayOfWeek -NotMatch "Friday"  `
        )
        {
        Move-Item $file.fullname $Directory -force
        }
} # L1 >>
$files = get-childitem $SourceDir *.*
foreach ($file in $files) 
{ # L1
    # weekly removal will not remove monthly copy, 4
    If($file.LastWriteTime -lt (Get-Date).adddays(-$KeepWeeks * 7).date  `
        -and (Get-LastFridayOfMonth ($file.LastWriteTime)).Date.ToString("yyyyMMdd") -NotMatch $file.LastWriteTime.Date.ToString("yyyyMMdd")
        )
        {
        Move-Item $file.fullname $Directory -force
        }
} # L1 >>
$files = get-childitem $SourceDir *.*
foreach ($file in $files) 
{ # L1
    # monthly removal will not remove quarterly copy, 6
    If($file.LastWriteTime.Month -lt ((Get-Date).Year - $file.LastWriteTime.Year) * 12 + (Get-Date).Month - $KeepMonths `
        -and $file.LastWriteTime.Month -NotIn 3, 6, 9, 12
        )
        {
        Move-Item $file.fullname $Directory -force
        }
} # L1 >>
$files = get-childitem $SourceDir *.*
foreach ($file in $files) 
{ # L1
    # quarterly removal will not remove yearly copy, 4
    If($file.LastWriteTime.Month -lt ( (Get-Date).Year - $file.LastWriteTime.Year) * 12 + (Get-Date).Month - $KeepQuarters * 3 `
        -and $file.LastWriteTime.Month -NotIn 12
        )
        {
        Move-Item $file.fullname $Directory -force
        }
} # L1 >>
$files = get-childitem $SourceDir *.*
foreach ($file in $files) 
{ # L1
    # yearly removal will just go straight ahead. 2
    If($file.LastWriteTime.Year -lt (Get-Date).Year - $KeepYears )
        {
        Move-Item $file.fullname $Directory -force
        }
} # L1 >>


<Functions.ps1>
function Get-TimesResult3 
    {
    Param ([int]$a,[int]$b)
    $c = $a * $b
    Write-Output $c
    }

function Get-Weekday {
    param(
        $Month = $(Get-Date -format 'MM'),
        $Year = $(Get-Date -format 'yyyy'),
        $Days = 1..5
    )
$MaxDays = [System.DateTime]::DaysInMonth($Year, $Month)
1..$MaxDays | ForEach-Object {
        Get-Date -day $_ -Month $Month -Year $Year |
          Where-Object { $Days -contains $_.DayOfWeek }  
    }
}

function Get-LastFridayOfMonth([DateTime] $d) {    
    $lastDay = new-object DateTime($d.Year, $d.Month, [DateTime]::DaysInMonth($d.Year, $d.Month))
    $diff = ([int] [DayOfWeek]::Friday) - ([int] $lastDay.DayOfWeek)

    if ($diff -ge 0) {
        return $lastDay.AddDays(- (7-$diff))
    }
    else {
        return $lastDay.AddDays($diff)
    }    
}
person Highwood    schedule 24.03.2016