la creación de script de PowerShell para copia de seguridad de un archivo y anexar la fecha

StackOverflow https://stackoverflow.com/questions/3671657

  •  01-10-2019
  •  | 
  •  

Pregunta

Actualmente tengo un archivo por lotes de una línea de copia de seguridad de un archivo. Corro de forma manual cuando necesito una copia de seguridad de un archivo. La única cosa que me gustaría añadir a ella es la fecha actual. Aquí es lo que tengo:

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

el archivo de destino debe ser simplemente ACTIVE.DB.BACKUP.YYYYMMDD. ¿Cómo hago para crear un guión que me permitirá hacer doble clic en él desde el Explorador de Windows y hacer que el xcopy suceda?

¿Fue útil?

Solución

Puede personalizar el nombre del archivo mediante la incorporación de un [datetime]::now formateado en el nombre del archivo en PowerShell, así:

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

Si la línea ocupada y se siente imposible de mantener, puede refactorizar a varias líneas:

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

Para obtener la ejecución del doble clic, por lo general preparo un archivo por lotes que se ejecuta el comando de PowerShell como se describe aquí:

ajuste hasta PowerShell Guión para la ejecución automática

Otros consejos

Sólo para señalar que se puede hacer esto con Copy-Item por ejemplo:.

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

Si vas a continuación robusta que haría uso de robocopy.exe.

acabo de hacer un script diario / semanal / mensual / trimestral / anual de copia de seguridad en Powershell este mes, y espero que ayude.

Este escenario es DWMQY copia de seguridad para comprimir una carpeta de origen a un archivo zip fecha-nombrado, a continuación, mantener las cremalleras de:

  • últimos 7 días
  • 4 semanas (cada viernes)
  • 6 meses (el último de cada mes del viernes)
  • 4 trimestres (el último mes es de trimestre)
  • 2 años (el último trimestre del año es).

Ejecutar como tarea programada en base diaria, que pone las cremalleras en una carpeta de destino, que es también una carpeta local de Microsoft onedrive, por lo que el también cremalleras ser sincronizado remotamente al servidor onedrive. Aquellos obsoleta (no todos los días Viernes o no de última DWMQY) cremalleras se moverán a una carpeta no sincronizado-remota.

Son las 5 de marzo de, el año 2016 hoy en día, los siguientes cremalleras deben estar en la carpeta de destino:

  • 7 días: 160304-160229-160227
  • 4 semanas: 160304, 160226, 160219,160212
  • 6 meses: 160226, 160129, 161225, 151127, 151025, 150925
  • 4 trimestres: 151225, 150925,150626,150327
  • 2 años: 151225, 141226

Así que habrá 23 cremalleras (en realidad menos desde los dups entre DWMQY), nuestros archivos son 250 documentos de texto, que es 0,4 GB después de comprimir, por lo que es 23 * 0,4 = 9,2 GB en total, que es inferior a onedrive libre 15 cuota GB.

Para datos de origen grandes, 7-zip se puede utilizar, que proporciona la máxima 16 mil tamaño postal TB. Para las carpetas de copia de seguridad directamente en lugar de cremalleras, no he probado. Supongo que es un procedimiento transferibles de la manera postal actual.

# 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)
    }    
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top