PowerShell文件自动备份
PowerShell是系统管理员的好工具,特别是它可以调用.Net的类库能帮助系统管理员实现以前很繁复的工作.以下是一个自动备份的ps脚本,呵呵,可以省去不少钱和时间。
#=======================================================================================================
#文件服务器自动隔日备份。邮件通知相关人员。
#Copy Right ZYQ
#日期:2010-6-29
#最后修改日期:2010-10-21
#=======================================================================================================
set-ExecutionPolicy Bypass -Force
$dedir="这里是存放备份文件夹的路径"
$LogDetail="这里是存放备份日志文件文件夹的路径"
$sourcedir="这里是要备份的文件夹的路径"
$lastdate=(Get-Date).AddDays(-1).Date
if( [System.Diagnostics.EventLog]::SourceExists("日志文件名称") -eq 0)
{
[System.Diagnostics.EventLog]::CreateEventSource("日志文件名称","日志文件名称显示名称")
}
$log=Get-EventLog -List | Where-Object{$_.Log -eq "日志文件名称显示名称"}
$log.Source="日志文件名称"
Set-Location $sourcedir
$log.WriteEntry($lastdate.ToShortDateString()+"备份开始","SuccessAudit")
$i=0
$DetailRecord=New-Object System.Text.StringBuilder
[void] $DetailRecord.AppendLine([System.String]::Concat($lastdate.ToShortDateString(),"文件备份明细记录"))
#以下的$file是System.IO.FileSystemInfo对象
#foreach( $file in Get-ChildItem -Recurse | Where-Object{(($_.LastWriteTime -ge $lastdate) -or ($_.LastWriteTime -lt $_.CreationTime)) -and ($_.Mode -eq '-a---')})
foreach( $file in Get-ChildItem -Recurse | Where-Object{(($_.LastWriteTime -ge $lastdate)) -and ($_.Mode -eq '-a---')})
{
#以下的$file是System.IO.filesinfo对象
$newfold=[string]($file.DirectoryName).Replace($sourcedir,$dedir)
if ([system.IO.Directory]::Exists($newfold) -eq 0)
{
md $newfold
}
Copy-Item $file.FullName -Destination $newfold
$i++
$msg="{0}被修改或创建的文件{1}已备份到{2}" -f $lastdate.ToShortDateString(),$file.FullName,$newfold
[void] $DetailRecord.AppendLine($msg)
#[System.Diagnostics.Debug]::Print($msg)
$newfold=""
$msg=""
}
#保存到文件
$LogDetail=$LogDetail +(Get-Date).Date.ToShortDateString().Replace("/","").Replace("-","")+".log"
if([System.IO.File]::Exists($LogDetail) -gt 0)
{
[System.IO.File]::Delete($LogDetail)
}
[System.IO.File]::AppendAllText($LogDetail,$DetailRecord.ToString())
#发送Email给xxx
$smtp=New-Object System.Net.Mail.SmtpClient
$smtp.Host="这里是发送邮件服务器"
$Credential=New-Object System.Net.NetworkCredential
$Credential.UserName="这里是发送邮件的用户名"
$Credential.Password="这里是发送邮件用户密码"
$Credential.Domain="这里是发送邮件用户所在的域名称"
$smtp.Credentials=$Credential
[void] $smtp.Send("发送者邮件地址","接收者邮件地址",[System.String]::Concat($lastdate.ToShortDateString(),"自动备份明细(",$i,")"),$DetailRecord.ToString())
#写入日志
$log.WriteEntry([System.String]::Concat($lastdate.ToShortDateString(),"备份结束。",$i,"个文件被复制到",$dedir,"。明细请看",$LogDetail,"。"),"SuccessAudit")
Exit
#文件服务器自动隔日备份。邮件通知相关人员。
#Copy Right ZYQ
#日期:2010-6-29
#最后修改日期:2010-10-21
#=======================================================================================================
set-ExecutionPolicy Bypass -Force
$dedir="这里是存放备份文件夹的路径"
$LogDetail="这里是存放备份日志文件文件夹的路径"
$sourcedir="这里是要备份的文件夹的路径"
$lastdate=(Get-Date).AddDays(-1).Date
if( [System.Diagnostics.EventLog]::SourceExists("日志文件名称") -eq 0)
{
[System.Diagnostics.EventLog]::CreateEventSource("日志文件名称","日志文件名称显示名称")
}
$log=Get-EventLog -List | Where-Object{$_.Log -eq "日志文件名称显示名称"}
$log.Source="日志文件名称"
Set-Location $sourcedir
$log.WriteEntry($lastdate.ToShortDateString()+"备份开始","SuccessAudit")
$i=0
$DetailRecord=New-Object System.Text.StringBuilder
[void] $DetailRecord.AppendLine([System.String]::Concat($lastdate.ToShortDateString(),"文件备份明细记录"))
#以下的$file是System.IO.FileSystemInfo对象
#foreach( $file in Get-ChildItem -Recurse | Where-Object{(($_.LastWriteTime -ge $lastdate) -or ($_.LastWriteTime -lt $_.CreationTime)) -and ($_.Mode -eq '-a---')})
foreach( $file in Get-ChildItem -Recurse | Where-Object{(($_.LastWriteTime -ge $lastdate)) -and ($_.Mode -eq '-a---')})
{
#以下的$file是System.IO.filesinfo对象
$newfold=[string]($file.DirectoryName).Replace($sourcedir,$dedir)
if ([system.IO.Directory]::Exists($newfold) -eq 0)
{
md $newfold
}
Copy-Item $file.FullName -Destination $newfold
$i++
$msg="{0}被修改或创建的文件{1}已备份到{2}" -f $lastdate.ToShortDateString(),$file.FullName,$newfold
[void] $DetailRecord.AppendLine($msg)
#[System.Diagnostics.Debug]::Print($msg)
$newfold=""
$msg=""
}
#保存到文件
$LogDetail=$LogDetail +(Get-Date).Date.ToShortDateString().Replace("/","").Replace("-","")+".log"
if([System.IO.File]::Exists($LogDetail) -gt 0)
{
[System.IO.File]::Delete($LogDetail)
}
[System.IO.File]::AppendAllText($LogDetail,$DetailRecord.ToString())
#发送Email给xxx
$smtp=New-Object System.Net.Mail.SmtpClient
$smtp.Host="这里是发送邮件服务器"
$Credential=New-Object System.Net.NetworkCredential
$Credential.UserName="这里是发送邮件的用户名"
$Credential.Password="这里是发送邮件用户密码"
$Credential.Domain="这里是发送邮件用户所在的域名称"
$smtp.Credentials=$Credential
[void] $smtp.Send("发送者邮件地址","接收者邮件地址",[System.String]::Concat($lastdate.ToShortDateString(),"自动备份明细(",$i,")"),$DetailRecord.ToString())
#写入日志
$log.WriteEntry([System.String]::Concat($lastdate.ToShortDateString(),"备份结束。",$i,"个文件被复制到",$dedir,"。明细请看",$LogDetail,"。"),"SuccessAudit")
Exit
使用下来,对100G的文件夹进行操作用时3.5分钟.
转载请注明:http://www.cnblogs.com/RZYQ/archive/2011/12/30/2308043.html