ディレクトリを構造ごとバックアップコピーする
ディレクトリを構造ごとバックアップコピーするスクリプトを考えてみました。
最初にコピー先のドライブの使用率を確認して、しきい値を超えていたら処理を exit 中断終了します。
コピー元のディレクトリを -Recurse でリカーシブにコピーします。
同名のファイルが存在すると -Force で強制上書きします。
Copy-Item "コピー元" "コピー先" -Recurse -Force
コピー元のディレクトリをリカーシブに移動します。(移動の場合は -Recurse オプションなし)
同名のファイルが存在すると -Force で強制上書きします。
Move-Item "コピー元" "コピー先" -Force
下記のスクリプトは、コピー先ディレクトリ名をミリ秒まで示す日時から生成するので -Force オプションは不要かもしれません。
# コピー先ディレクトリのドライブレター.
$drive_letter_dst = "e"
# 容量のしきい値パーセント.
$limit = 75
# ドライブ情報を取得する.
$drv = Get-PSDrive $drive_letter_dst
# ドライブの空き容量と使用量を加算して総容量を知る.
$total = ( $drv.Free + $drv.Used )
# 使用率を計算する.
$rate = ( $drv.Used ) / $total
# パーセントにして整数化する.
$rate_percent = [int]( $rate * 100.0 )
# 使用率が75%以上だと処理を中断する.
if ( $rate_percent -ge $limit )
{
Write-Host( "There is not enough space in the copy dest dir." )
exit
}
function get_yyyy_mmdd_hhmmss_nnn( $args_dtm )
{
# DateTime のメンバを参照する.
$y4 = $args_dtm.Year
$m2 = $args_dtm.Month
$d2 = $args_dtm.Day
$hh = $args_dtm.Hour
$mm = $args_dtm.Minute
$ss = $args_dtm.Second
$ms = $args_dtm.Millisecond
# .NET の String.Format() みたいな感じ.
$ret_str = "{0:d4}_{1:d2}{2:d2}_{3:d2}{4:d2}{5:d2}_{6:d3}" -f $y4, $m2, $d2, $hh, $mm, $ss, $ms
return $ret_str
}
# 日時を示す名前のディレクトリを作成したい.
$dtm = Get-Date
$ymdhmsn = get_yyyy_mmdd_hhmmss_nnn( $dtm )
# コピー元のディレクトリとコピー先のディレクトリ.
$dir_src = "c:/tmp/record"
$dir_dst = $drive_letter_dst + ":/" + $ymdhmsn
# ディレクトリを作成する.
New-Item $dir_dst -ItemType Directory
# コピー元のディレクトリをリカーシブにコピーする、ファイルが重複しても強制上書きする.
Copy-Item $dir_src $dir_dst -Recurse -Force
# コピー元のディレクトリをリカーシブに移動する、ファイルが重複しても強制上書きする.
# Move-Item $dir_src $dir_dst -Force
# コピー成功を表示する.
Write-Host( "Finish." )