5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PowerShellで7-zip.exeを使って指定ファイルを自動バックアップするスクリプト

Last updated at Posted at 2016-05-18

もちろん、別途powershellを定期的に自動実行する仕組みは必要。自分の記事だけど参照。
PowerShellで重いタスクスケジューラーに頼らずcronを実行・管理する方法 - Qiita
「windows」で「PowerShell」を「一切画面表示せず」に「タスクスケジューラに登録」する方法を再確認 - Qiita

そしてこんな感じでアーカイブするファイルを定義する

doArchive "JaneLast.dat" {
	# Join-Path
	# Get-Date -Format "yyyy年MM月dd日(ddd)HH時mm分ss秒"
	# New-item -type directory
	$baseDir = $args[0]
	$subDir = Join-Path $baseDir (Get-Date -Format "yyyy年MM月dd日")
	New-item $subDir -type directory
	copy-item "C:\OpenJane\last.dat" $subDir
	copy-item "C:\OpenJane\last.bak" $subDir
}

この例だと、JaneLast.dat.zip の中に2016年10月12日 というディレクトリを作って、その中にlast.datとlast.bakを保存する
運用を続けると、JaneLast.dat.zipの中には一日ごとのファイルが保存され続ける。
具体的な処理はdoArchive メソッドの第二引数ので自由に制御出来る。
この第二メソッドは、引数にtempディレクトリに作られたカラのフォルダのパスが渡されるので、そのフォルダの中にバックアップしたいファイルを手動でコピーしてメソッドを抜ける。
後は、メイン関数がそのフォルダの中をまるごとzipして、ファイルが無ければ新規作成 あれば追記する。tempのディレクトリをまるごと消して終了

フォルダ名を工夫すれば一日ごとじゃなくて一ヶ月ごとも出来るし、曜日にすれば一週間のローテートが出来る。

ログファイルはこんな感じ。アーカイブ名と、ファイルサイズと、ファイルサイズの増加量。

2016/05/18(水)23:19:07 JaneLast.dat 31.732 Mbyte +957 byte

以下コード。煮るなり焼くなり好きにどうぞ

$7zip="C:\7-Zip\7z.exe" # 書き換えてね
$logPath="${PSScriptRoot}\log.txt"
$archivePathDir="${PSScriptRoot}\archives\"

function doArchive([string]$zipName,$callback){
	$start = get-date
	$error = ""
	$tempDir = $env:temp + "\archive-" + (Get-Random)
	[String]$callbackLog = ""
	[String]$zipLog = ""
	[long]$beforeSize = 0
	[long]$afterZipSize = 0
	try{
		$zipPath ="${archivePathDir}${zipName}.zip"
		if ( Test-Path $zipPath ){
			$beforeSize = (get-childItem "${zipPath}").length
		}
		$callbackLog = & $callBack $tempDir
		$zipLog = & "$7zip" a "${zipPath}" "${tempDir}/*"
		Remove-Item -LiteralPath "${tempDir}" -Force -Recurse
		$afterZipSize = (get-childItem "${zipPath}").length
	}catch{
		$error = $_
	}
	$end = get-date
	# ログ書き出し
	# 2016/01/01(日)00:00:00 janelast.dat 圧縮したファイル
	$logText =$start.toString("yyyy/MM/dd(ddd)HH:mm:ss")+" "+$zipName + " "
	if( $error -ne "" ){
		$logText+="★ ${error}"
	}
	$logText += ( formatSize $afterZipSize )
	if ( $afterZipSize -gt $beforeSize ){
		$logText += " +" +( formatSize ($afterZipSize-$beforeSize) )
	}else{
		$logText += " -" +( formatSize ($beforeSize-$afterZipSize) )
	}
	$logText >> $logPath
}
function formatSize([double]$size){
	# 引数のバイトを  10.212 Kbyte の様にフォーマットして表示する
	$digit = 1000
	if ( $size -lt $digit ){
		"${size} byte"
	}elseif( $size -lt $digit*$digit ){
		"{0:0.000} Kbyte" -F ( $size / $digit )
	}elseif( $size -lt $digit*$digit*$digit ){
		"{0:0.000} Mbyte" -F ( $size / $digit / $digit )
	}elseif( $size -lt $digit*$digit*$digit*$digit ){
		"{0:0.000} Gbyte" -F ( $size / $digit / $digit / $digit )
	}elseif( $size -lt $digit*$digit*$digit*$digit*$digit ){
		"{0:0.000} Tbyte" -F ( $size / $digit / $digit / $digit / $digit )
	}else{
		"${size} byte"
	}
}
# ここからアーカイブ情報
doArchive "JaneLast.dat" {
	# Join-Path
	# Get-Date -Format "yyyy年MM月dd日(ddd)HH時mm分ss秒"
	# New-item -type directory
	$baseDir = $args[0]
	$subDir = Join-Path $baseDir (Get-Date -Format "yyyy年MM月dd日(ddd)HH時mm分ss秒")
	#$subDir = Join-Path $baseDir (Get-Date -Format "yyyy年MM月dd日")
	New-item $subDir -type directory
	copy-item "C:\OpenJane\last.dat" $subDir
	copy-item "C:\OpenJane\last.bak" $subDir
}

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?