ディレクトリを構造ごとバックアップコピーする

ディレクトリを構造ごとバックアップコピーするスクリプトを考えてみました。

最初にコピー先のドライブの使用率を確認して、しきい値を超えていたら処理を 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." )