Erstellen von Powershell-Skript, eine Datei zu sichern und fügen Sie das Datum
-
01-10-2019 - |
Frage
Zur Zeit habe ich eine einzeilige Batchdatei, eine Datei zu sichern. Ich betreibe es manuell, wenn ich eine Datei sichern müssen. Das einzige, was Ich mag würde, um es hinzuzufügen ist das aktuelle Datum. Hier ist, was ich habe:
xcopy / W / Y ACTIVE.DB ACTIVE.DB.BACKUP
die Zieldatei sollte einfach ACTIVE.DB.BACKUP.YYYYMMDD sein. Wie würde ich mich über ein Skript erstellen, die mir einen Doppelklick darauf aus dem Windows Explorer ermöglicht und macht die XCOPY passieren?
Lösung
Sie können Ihre Dateinamen anpassen, indem Sie eine formatierte [datetime]::now
im Dateinamen in Powershell Einbettung in etwa so:
xcopy /W /Y ACTIVE.DB "ACTIVE.DB.BACKUP.$([datetime]::now.ToString('yyyy-MM-dd'))"
Wenn die Leitung besetzt und wartbaren fühlt, können Sie es auf mehrere Zeilen Refactoring:
$now = [datetime]::now.ToString('yyyy-MM-dd')
xcopy /W /Y ACTIVE.DB "ACTIVE.DB.BACKUP.$now"
Doppelklick Ausführung zu erhalten, ich in der Regel eine Batch-Datei, die den Powershell-Befehl ausgeführt wird, wie hier beschrieben:
Andere Tipps
Nur darauf hinweisen, dass Sie diese mit Copy-Item z tun können.
Set-Location $path
Copy-Item ACTIVE.DB "ACTIVE.DB.$(get-date -f yyyyMMdd)" -Force -Confirm
Wenn Sie robuste fahren, dann würde ich robocopy.exe
verwenden.
Ich habe gerade eine täglich / wöchentlich / monatlich / Quartals- / Jahres Backup-Skript in Powershell in diesem Monat, und hoffen, dass es hilft.
Dieses DWMQY Backup-Szenario ist ein Quellordner zu einem Datum genannten Zip-Datei zip, dann halten Sie die Reißverschlüsse von:
- letzten 7 Tagen
- 4 Wochen (jeweils am Freitag)
- 6 Monate (der letzten jeden Monat Freitag)
- 4/4 (der letzte Monat des Quartals)
- 2 Jahre (das letzte Quartal ist das Jahres).
Ausführen als geplante Aufgabe auf täglicher Basis, bringt es die Reißverschlüsse in einen Zielordner, die auch eine Microsoft Microsoft Onedrive lokalen Ordner vorhanden ist, so auch die Reißverschlüsse der Ferne Microsoft Onedrive Server synchronisierten werden. Diejenigen veraltet (nicht-Freitag täglich oder Nicht-Last-DWMQY) Reißverschlüsse werden an einen nicht fern synchronisierten Ordner verschoben werden.
Es ist 5. März 2016 heute die folgenden Reißverschluss im Zielordner sein sollten:
- 7 Tage: 160304-160229-160227
- 4 Wochen: 160304, 160226, 160219,160212
- 6 Monate: 160226, 160129, 161225, 151127, 151025, 150925
- 4/4: 151225, 150925,150626,150327
- 2 Jahre: 151225, 141226
So wird es 23 Zips (weniger tatsächlich seit den dups unter DWMQY), unsere Dateien sind 250 Textdokumente, die nach zippen 0,4 GB ist, so dass er 23 ist * 0,4 = 9,2 GB insgesamt, was weniger ist als Microsoft Onedrive free 15 GB-Quote.
Für große Quelldaten, 7-zip kann dazu verwendet werden, die maximal 16 mil TB zip Größe bietet. Für direkt Backup-Ordner anstelle von Reißverschlüssen, habe nicht versucht. Erraten es ist ein übertragbares Verfahren aus der aktuellen zip Art und Weise.
# 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)
}
}