使用PowerShell压缩备份文件夹

先贴代码后解释。


#作者:张瑞森
#版本号:2.0.20160811
#日期:2016.08.11

#设置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脚本。

原来是全都备份一遍,然而并不是每个文件夹每次都修改了,没有修改就没有必要再备份一份。

同样的还有系统计划任务的事情,没必要设置定时任务,每天结束前手动运行一下脚本即可。

你可能感兴趣的:(Shell)