UpdateCopy の続き

以前に、UpdateCopyするスクリプトを書きましたが、訂正と追加があります。
訂正分ですが、UpdateCopyに失敗する場合がありました。
コピー先にファイルが存在していないと、絶対パスに変換時エラーになります。


param([String]$srcfile, [String]$dstfile)

# 相対パスから絶対パス
$srcfile = Convert-Path $srcfile
# ファイルがないとエラーになる
if ([System.IO.File]::Exists($dstfile))
{
$dstfile = Convert-Path $dstfile
}

[System.IO.File]::SetAttributes($srcfile, "Normal")
if ([System.IO.File]::Exists($dstfile))
{
[System.IO.File]::SetAttributes($dstfile, "Normal")
$srctime = [Syste.IO.File]::GetLastWriteTime($srcfile)
$dsttime = [Syste.IO.File]::GetLastWriteTime($dstfile)
if ($srctime -gt $dsttime)
{
[System.IO.File]::Copy($srcfile, $dstfile, $true)
}
}
else
{
[System.IO.File]::Copy($srcfile, $dstfile)
}

上記のスクリプトを使って、フォルダごとUpdateCopyするスクリプト

$dstpath = "コピー先のフォルダパス"
Get-ChildItem "コピー元にフォルダパス" | foreach (&_) {.\UpdateCopy.ps1 $_.fullname (Join-Path $dstpath $_.name)}
UpdateCopy.ps1 は最初のスクリプトをファイルにしたものです。
あるフォルダの中だけを別のフォルダにUpdateCopyするスクリプトです。
サブフォルダは、コピーしないので注意してください。
サブフォルダある場合は「-recurse」などのオプションを追加してください。


簡単に解説すると、Get-ChildItem(つまりdir)でフォルダのファイル一覧を取得する。
一覧をforeachで1つずつUpdateCopy.ps1 に引数で渡します。
第2引数には、コピー先のフォルダとコピー元のファイル名のみをジョインしたものを渡す。