最近有朋友要帮忙写个脚本能够自动的备份相应的数据库的备份自动的进行双备份,一份备份到本地其他磁盘,一份备份到网络上的其他的机器上,根据他的需求,我们整理如下的范例:
1.每天晚上0:00在e:\db_bak\history\下面建一个目录
目录名:(根据当天日期创建)
e:\db_bak\history\20131010
e:\db_bak\history\20131011
2.将E:\db_bak\下面的所有.bak文件复制到e:\db_bak\history\20131011下面
同时将e:\db_bak\下面的所有的.bak文件复制到\\172.16.100.254\backup\20131011下面
没有该文件夹,需要创建
3.实现数据双备份,且将复制的数据log记录到一个Log.txt中,实现追加
格式为:
在20131011 112233时,已复制e:\db_bak\ orderdb_20131011112233_full.bak到e:\db_bak\history\20131011
在20131011 112233时,已复制e:\db_bak\ orderdb_20131011112233_log.bak到e:\db_bak\history\20131011
在20131011 112233时,已复制e:\db_bak\ orderdb_20131011112233_full.bak到\\172.16.100.254\backup\20131011
在20131011 112233时,已复制e:\db_bak\ orderdb_20131011112233_log.bak到\\172.16.100.254\backup\20131011
4. 删除e:\db_bak\下面所有的.bak文件
根据以上需求,我们编写出如下的Powershell脚本:
param定义餐宿
#Edit by Raymond,if you have question,Please contact me for more
(
[string] $baksource="d:\temp",
#定义备份源目录
[string] $bakdestination="d:\temp\bak",
#定义备份的目标路径
[string] $logfile="d:\log\log.txt",
#定义备份时候日志写入的文件
[string] $networkshare="\\localhost\kugou"
#定义备份的网络路径
)
$Dpath=$bakdestination+"\"+(Get-Date).tostring("yyyyMMdd")
#定义备份目录自动产生的目录路径,根据当天日期产生201310-11样式路径
New-PSDrive -Name s -Root $networkshare -PSProvider filesystem
#将网络路径映射到本地的S盘
Set-Location s:
$Npath="s:\"+(Get-Date).tostring("yyyyMMdd")
#定义我们复制的S盘复制的路径
$Nrealpath=$networkshare+"\"+(Get-Date).tostring("yyyyMMdd")
#定义网络复制实际路径
if (!(test-path -Path $dpath))
#如果复制路径的子目录不存在
{
set-location $bakdestination
New-Item -ItemType directory -Path $dpath
#自动新建这个目录
}
if (!(test-path $logfile))
#如果日志文件不存在
{
New-Item -ItemType file -Path $logfile
#自动新建文件
}
Set-Location $baksource
#定义到备份源目录
$fileitems=Get-ChildItem *.* -Include *.txt
#查询本目录下所有以txt结尾的文件
foreach($fileitem in $fileitems)
#根据查询到的文件进行循环
{
$copystring="在"+(Get-Date).tostring("yyyyMMdd HHmmss")+"时,已复制"+$fileitem.fullname+"到"+$Dpath
#生成需要写到日志中的内容
Copy-Item -Path $fileitem -Destination $dpath
#将文件拷贝到本地磁盘的备份目标目录
if($?)
#如果拷贝命令成功执行
{
$copystring |Out-File -Append -filepath $logfile
将日志写入到日志对应的目录文件
}
$Ncopystring="在"+(Get-Date).tostring("yyyyMMdd HHmmss")+"时,已复制"+$fileitem.fullname+"到"+$Nrealpath
#生成写入日志的文件
Copy-Item -Path $fileitem -Destination $Npath
#将内容拷贝到网络路径
if($?)
#如果命令成功执行
{
$Ncopystring |Out-File -Append -FilePath $logfile
#将日志记录到相应的日志文件中
Remove-Item -Path $fileitem
#同时删除掉相应的目录文件
}
}
Remove-PSDrive s
#删除映射的S盘
执行以后,我们在相应的目录能够发现文件:
网路路径:
接下来我们查看下日志:
基本上达成了相应的目标