技术分享
使用PowerShell压缩备份文件夹
2018-05-29
先贴代码后解释。
#设置7-zip.exe的文件路径 [String]$zip = "C:\Program Files\7-Zip\7z.exe" #设置压缩文件的名称 [String]$name = "OneNote.7z" #设置需要备份的文件或者文件夹的路径 [String]$path = "E:\JianGuoYun\OneNote" [String]$temp = "$($env:TMP)\$((Get-Date).ToString("yyyyMMddHHmmss"))" New-Item -ItemType Directory -Path $temp cd $temp & $zip a $name $path if ($?) { #设置备份路径 [String]$destinationPath = "$($HOME)\Documents\Back_up_daily\$((Get-Date).ToString("yyyyMM"))\$((Get-Date).ToString("yyyyMMdd"))" if (!(Test-Path -Path $destinationPath)) { New-Item -ItemType Directory -Path $destinationPath } Copy-Item $name $destinationPath -Force if (Test-Path -Path "O:\") { #设置O盘中的备份路径 [String]$destinationPathO = "O:\Back_up_daily\$((Get-Date).ToString("yyyyMM"))\$((Get-Date).ToString("yyyyMMdd"))" if (!(Test-Path -Path $destinationPathO)) { New-Item -ItemType Directory -Path $destinationPathO } Copy-Item $name $destinationPathO -Force } } cd $HOME Remove-Item $temp -Recurse
以上是我电脑中实际运行着的脚本。可以复制之后直接用,只需修改有注释的那几个地方的变量内容,把路径改一下就好。
想法是,首先压缩到系统的%TMP%文件夹,如果压缩成功,则将压缩好的文件再复制到个人的文档文件夹(虽然中文版上显示的是文档,但是实际上是英文的Documents)下用来备份。如果检测到已连接到专用的外置存储设备(为了避免连接其他设备时错误备份到其中,将专用的外置存储设备的盘符修改为比较靠后的,平时根本用不到的盘符。从而检测到该盘符即可认为是连接了专用的那个外置存储设备),则也复制一份过去。
不采取增量备份,每次备份时都备份全部文件,通过压缩来减少占用空间,同时不删除过去的备份文件。现在的硬盘极其便宜,足以支持如此备份。
需要在电脑上先安装好7-zip。然后设置好7-zip的安装路径、需要备份的文件夹路径、将需要备份的文件夹压缩之后得到的压缩文件的名称。
在系统的%TMP%文件夹下新建一个以当前系统时间为名称的文件夹,以“年月日时分秒”的格式来命名,应该能保证唯一性。切换到该路径,将需要备份的文件夹压缩到该路径下。
判断压缩语句是否执行成功,压缩成功才进行复制。其中$?的值为true或者false,含义是上一条语句是否执行成功。
在文档文件夹下建立了一个名为Back_up_daily的文件夹,作为总的备份目录,然后在其中建立了以“年月”为格式的一个文件夹,之后进一步建立了一个以“年月日”为格式的文件夹,用来保存压缩好的备份文件。如果相关的文件夹不存在则建立。
拷贝压缩文件时,如果存在同名文件,则一定是当日备份的,采取强制覆盖方式,替换掉当日已经存在的压缩文件。
判断专用的外置存储设备是否存在,存在则复制一份过去,不存在就跳过。
当所有该复制的文件都复制完毕之后,切换到其他的路径,然后删除%TMP%文件夹中所建立的临时文件夹。
以上是一个文件夹,生产一个压缩文件,复制到多个路径的情况。如果是多个文件夹呢?
那就复制一份上边的代码,略微改一下,再建一个脚本呗。哪个文件夹修改了,关机前就执行相应的PowerShell脚本。
原来是全都备份一遍,然而并不是每个文件夹每次都修改了,没有修改就没有必要再备份一份。
同样的还有系统计划任务的事情,没必要设置定时任务,每天结束前手动运行一下脚本即可。

- 标签:
-
云计算