- このディレクトリ以下をすべて圧縮して取っておきたい!
- でも合計サイズが大きすぎてzipできない!
- 時間がかかってもいいからシンプルにやりたい!
こんなときは7zipが便利。
さらにちょくちょくやるから実行ファイルにしておきたい。
そこで簡単なPowerShellスクリプトを作りました。
7zipをコマンドラインで使う
dllを必要としないスタンドアローンな7zipコマンドラインツール7za.exe
は、通常のパッケージとは別にダウンロードすることになります。
https://www.7-zip.org/download.html
上記の7-Zip Extra: standalone console version, 7z DLL, Plugin for Far Manager
と書かれているものに含まれている。
この7za.exe
をコマンドラインで呼び出す形で行きます。
詳しい使い方は公式ガイドを参照のこと
今回下で使ったのは圧縮コマンドのみ
"7za.exe" a -r c:\path\to\Dist.7z
- -r はrecoursiveオプション
- カレントにある全てのファイルを再帰的に c:\path\to\Dist.7z に圧縮する
- tarコマンドで言うところの
-C
オプションに相等するものがないので、この上でSet-Location
(cd)している
スクリプト
- このスクリプトと
7za.exe
は同じディレクトリにある必要がある - 実行するとスクリプトと同じディレクトリに
YYYY_MM_DD_bak.7z
という名前の7zipバックアップができる - 3以上バックアップがあると古いものから消していく
- できたバックアップを解凍すると、$SourceDir(C:\path\to\Source)の中身がまるっと手に入る
7zBackup.ps1
# [7za.exe](https://sevenzip.osdn.jp/)を使ってディレクトリをbackup
# Set the properties
$7za = $PSScriptRoot+"\7za.exe"
$SourceDir = "C:\checkout\koba"
$Dist = $PSScriptRoot + (Get-Date -UFormat "\%Y_%m_%d_bak.7z")
$BackupMaxNum = 3
# Stop the apps using SourcePath
# backup
Set-Location $SourceDir
Invoke-Expression "$7za a -r $Dist"
Set-Location $PSScriptRoot
# delete old backup
$counter = $BackupMaxNum
Get-ChildItem $PSScriptRoot -Filter "*_bak.7z" | `
Sort-Object -Property LastWriteTime -Descending | `
ForEach-Object -Process {
Write-Output "in"
if($counter -gt 0){
$counter--
}
else{
Remove-Item $_.FullName
}
}
# Restart apps