function New-ipxBackupFolder {
param (
[Parameter(Mandatory=$true,HelpMessage='Pfad zum Ziel')]
[string]$Path,
[Parameter(HelpMessage='Uhrzeit bei diff./ink. Backup anfügen')]
[switch]$time,
[Parameter(HelpMessage='Wochentag bei diff./ink. Backup anfügen')]
[switch]$Weekday
)
if ( Test-Path -Path $Path ) {
if ( $Weekday ) { $subfolder = [System.DateTime]::Today.ToString("dddd") }
if ( $time ) { $subfolder = (Get-Date -Format yyMMdd) + "_" + (Get-Date -Format HHmm) }
if ( !$Weekday -and !$time) { $subfolder = (Get-Date -Format yyMMdd) }
if ( !(Test-Path -Path $Path\$subfolder)) {
New-Item -Path $Path\$subfolder -ItemType Directory | Out-Null
}
}
$Path + "\" + $subfolder
}
function Backup-ipxItem {
<#
.Synopsis
Kopiert mittels Robocopy einen Ordner für Backupzwecke
.Description
Stellt eine Powershell Implementierung für Robocopy dar.
Unterstützt werden Volles Backup (mit/ohne Remove-Archivebit), Differentiell und Inkrementelle Methode.
Zusätzliche Optionen sind Dateifilter, Ordnerberechtigungen, Wiederholte Versuche und Wartezeit.
Der Logfile backupitem_YYYYV.txt wird entweder im Zielverzeichnis oder im angegebenen Ordner angelegt.
Nur bei mirror werden alle Informationen in den Logfile geschrieben.
Der Zielordner muss existieren, sonst bricht robocopy ab.
.Parameter Source
Quellordner mit den zu kopierenden Dateien
.Parameter Destination
Zielordner wohin kopiert werden soll
.Parameter Filter
Dateifilter um nur bestimmte Dateitypen zu kopieren
.Parameter Logpath
Ordner in dem der Logfile angelegt werden soll, Vorgabe ist Destination
.Parameter Mirror
Spiegelt die Quelle im Ziel, löscht demnach auch nicht mehr vorhandene Dateien
.Parameter Retry
Wiederholungsversuche bei fehlerhaften Zugriffen, Vorgabe ist Null Sekunden
.Parameter Wait
Wartezeit bis zum nächsten Kopierversuch für eine Datei
.Parameter ACL
Kopiert die Sicherheitsinformationen und schreibt sie explizit ohne Vererbung auf das Ziel
.Parameter time
Fügt bei der differentiellen/inkrementellen Sicherung die Uhrzeit _HHmm an den Sicherungsordner
.Example
Backup-ipxItem -source C:\users\user\Downloads -destination d:
Kopiert den Downloadordner des Benutzers nach D: und legt den Logfile ebenfalls unter D: ab.
.Example
Backup-ipxItem -source C:\users\user\Downloads -destination d: -logpath C:\users\user\documents
Kopiert ebenfalls den Downloadordner nach D, der Logfile wird aber im benutzerverzeichnis abgelegt.
.Example
Backup-ipxItem -source C:\users\user\Downloads -destination d: -removearchivebit
Ebenfalls Kopie von Downloads nach D, es wird aber das Archivebit zurückgesetzt.
.Example
Backup-ipxItem -source C:\users\user\Downloads -destination d: -incremental
Kopiert nur die geänderten Dateien in Downloads nach D:\yyMMdd\ (=aktuelles Datum) und setzt das Archivebit zurück.
.Example
Backup-ipxItem -source C:\users\user\Downloads -destination d: -differential
Wie -incremental, jedoch wird das Archivbit nicht zurückgesetzt.
.Example
Backup-ipxItem -source C:\users\user\Downloads -destination d: -differential -time
Zusätzlich wird durch -time die Uhrzeit eingefügt, also D:\yyMMdd_HHmm\
Damit lässt sich mehrmals täglich ein Backup der geänderten Dateien erzeugen.
.Example
Backup-ipxItem -source C:\users\user\Downloads -destination d: -ACL
Kopiert zusätzlich die (vererbten) Dateiberechtigungen (R/W ...) in explizite Rechte der Zieldateien.
.Notes
Version: 1.0.1.0
Stand 23.2.2015
.Inputs
None
.Outputs
System.IO.Directory und System.IO.File
gesicherte Dateien und logfile *.txt
#>
param (
[Parameter(Mandatory=$true,HelpMessage='Pfad zur Quelle')]
[string]$Source,
[Parameter(Mandatory=$true,HelpMessage='Pfad zum Ziel')]
[string]$Destination,
[Parameter(HelpMessage='Dateifilter')]
$filter = '',
[Parameter(HelpMessage='Ordner für Logfile')]
[string]$logpath = '',
[Parameter(HelpMessage='Spiegelmodus, gelöschte werden entfernt')]
[switch]$mirror,
[Parameter(HelpMessage='X Wiederholungen bei Fehler')]
[int]$retry = 0,
[Parameter(HelpMessage='X Sekunden Wartezeit bei bevor erneut versucht wird zu kopieren')]
[int]$wait = 10,
[Parameter(HelpMessage='Zugriffsrechte kopieren und explizit auf Dateien anwenden')]
[switch]$ACL,
[Parameter(HelpMessage='Archivebit zurücksetzen')]
[switch]$RemoveArchivebit,
[Parameter(HelpMessage='Inkrementelles Backup in Ordner mit yyMMddhh')]
[switch]$Incremental,
[Parameter(HelpMessage='Differenzielles Backup in Ordner mit yyMMddhh')]
[switch]$Differential
)
[string]$mir = ''
[string]$rights = ''
[string]$date= get-date -uformat %Y%V
[string]$option1 = '/e'
[string]$option2 = ''
$attribute = [System.IO.FileAttributes]::archive
if ($logpath -eq '' ) { $logpath = $destination }
if ( $filter -eq '' ) { $filter = '*.*' }
if ( $ACL ) { $rights = '/copy:DATSO' }
if ( $mirror ) {
$option1 = '/e'
$option2 = '/mir'
}
if ( $Incremental ) {
$option1 = '/s'
$option2 = '/m'
}
if ( $Differential ) {
$option1 = '/s'
$option2 = '/a'
}
robocopy "$Source" "$Destination" $filter $option1 $option2 $rights /R:$retry /W:$wait /log+:$logpath\backupitem_$date.txt /ndl /nfl /v
if ( $RemoveArchivebit) {
Get-ChildItem -Path $Source -Recurse -File | Remove-ipxArchivebit
}
}
function Get-ipxArchivebit {
<#
.Synopsis
Ermittelt Dateien anhand des Archivebits.
.Description
Im angegebenen Ordner selbst oder rekursiv durch alles Unterordner
werden die Dateien ermittelt die ein Archivebit gesetzt haben.
Alternativ können über "inverse" als Dateien ohne Archivebit ermittelt werden.
Über "filter" können Dateitypen wie *.jpg angegeben werden.
.Parameter path
Ordnerpfad in dem die Dateien ermittelt werden sollen.
.Parameter filter
Optionaler Dateifilter wie *.jpg oder *.avi.
.Parameter recurse
Aktiviert die rekursive Suche in allen Unterordnern von $path.
.Parameter inverse
Invertiert die Suche und findet alle Dateien ohne Archivebit.
.Example
Get-ipxArchivebit -path C:\users\user\downloads
Ermittelt alle Dateien mit Archivebit im Downloadordner eines Benutzers "user".
.Example
Get-ipxArchivebit -path C:\users\user\downloads -recurse
Ermittelt alle Dateien mit Archivebit im Downloadordner und den Unterordnern eines Benutzers "user".
.Example
Get-ipxArchivebit -path C:\users\user\downloads -inverse -recurse
Ermittelt alle Dateien ohne Archivebit im Downloadordner und den Unterordnern eines Benutzers "user".
.Example
Get-ipxArchivebit -path C:\users\user\downloads -inverse -recurse | Set-ipxArchivebit
Ermittelt rekursiv alle Dateien ohne Archivebit und setzt es danach über die Pipeline.
.Example
Get-ipxArchivebit -path C:\users\user\downloads -recurse | Remove-ipxArchivebit
Ermittelt rekursiv alle Dateien mit Archivebit und entfernt es danach über die Pipeline.
.Inputs
System.IO.DirectoryInfo als System.String path
System.String filter
System.SwitchParameter recurse und inverse
.Outputs
System.Array
.Notes
Version: 1.0.0.0
Datum: 1.3.2015
.Component
None
#>
param (
[Parameter(Mandatory,HelpMessage='Ordnerpfad zu Dateien')]
[string]$path,
[Parameter(HelpMessage='Dateifilter')]
[string]$filter='',
[Parameter(HelpMessage='rekursiv oder nur angegebener Ordner')]
[switch]$recurse,
[Parameter(HelpMessage='Sucht Dateien ohne Archivbit')]
[switch]$inverse
)
$attribute = [System.IO.FileAttributes]::archive
if ( $recurse ) {
Get-ChildItem -Path $path -Filter $filter -Recurse -File |
ForEach-Object {
if ( !$inverse ) {
if ( (Get-ItemProperty -Path $_.FullName).Attributes -band $attribute ) { $_ }
}
else {
if ( (Get-ItemProperty -Path $_.FullName).Attributes -band $attribute ) { <#<do nothing#> }
else { $_ }
}
}
}
else {
Get-ChildItem -Path $path -Filter $filter -File |
ForEach-Object {
if ( !$inverse ) {
if ( (Get-ItemProperty -Path $_.FullName).Attributes -band $attribute ) { $_ }
}
else {
if ( (Get-ItemProperty -Path $_.FullName).Attributes -band $attribute ) { <#<do nothing#> }
else { $_ }
}
}
}
}
function Set-ipxArchivebit {
<#
.Synopsis
Setzt das Archivebit für Dateien die es nicht gesetzt haben.
.Description
In einer Pipeline werden erst Dateien ermittelt die der Funktion übergeben werden,
die dann das Archivebit setzt, wenn es nicht vorhanden ist.
.Parameter path
Voller Dateipfad der von der Pipeline kommt und als Alias 'FullName' gemapped wird.
.Example
Get-ipxArchivebit -path C:\users\user\downloads -inverse -recurse | Set-ipxArchivebit
Ermittelt rekursiv alle Dateien ohne Archivebit und setzt es danach über die Pipeline.
.Inputs
System.IO.DirectoryInfo als System.String path
.Outputs
None
.Notes
Version. 1.0.0.0
Datum: 1.3.2015
.Component
None
#>
param (
[Parameter(Mandatory,HelpMessage='Dateipfad aus der Pipeline',ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[Alias('Fullname')]
[string]$path
)
begin {
$attribute = [System.IO.FileAttributes]::archive
}
process {
if ((Get-ItemProperty -Path $path).Attributes -band $attribute ) { <#do nothing#> }
else {
Set-ItemProperty -Path $path -Name Attributes -Value ((Get-ItemProperty -Path $path ).Attributes -bxor $attribute) -ErrorAction SilentlyContinue
}
}
}
function Remove-ipxArchivebit {
<#
.Synopsis
Entfernt das Archivebit für Dateien die es gesetzt haben.
.Description
In einer Pipeline werden erst Dateien ermittelt die der Funktion übergeben werden,
die dann das Archivebit entfernt, wenn es vorhanden ist.
Findet Verwendung bei Backup-Item und Backup-ItemToZip.
.Parameter path
Voller Dateipfad der von der Pipeline kommt und als Alias 'FullName' gemapped wird.
.Example
Get-ipxArchivebit -path C:\users\user\downloads -recurse | Remove-ipxArchivebit
Ermittelt rekursiv alle Dateien mit Archivebit und entfernt es danach über die Pipeline.
.Inputs
System.IO.DirectoryInfo als System.String path
.Outputs
None
.Notes
Version. 1.0.0.0
Datum: 1.3.2015
.Component
None
#>
param (
[Parameter(Mandatory,HelpMessage='Dateipfad aus der Pipeline',ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[Alias('Fullname')]
[string]$path
)
begin {
$attribute = [System.IO.FileAttributes]::archive
}
process {
if ((Get-ItemProperty -Path $path).Attributes -band $attribute ) {
Set-ItemProperty -Path $path -Name Attributes -Value ((Get-ItemProperty -Path $path ).Attributes -bxor $attribute)
}
}
}