PowerShell 変更があったファイルだけコピー
変更があったファイルだけコピーするサンプルを作ってみました。
■変更があったファイルだけコピー
$dirA にコピー元フォルダを指定し、$dirB にコピー先フォルダを指定します。.txtファイルのみを対象としています。
#パス変更
function changePath($dirF, $dirT, $path) {
$name = $path.SubString($dirF.Length)
return $dirT + $name
}
#比較するフォルダ
$dirA = "C:\work\from"
$dirB = "C:\work\to"
#フォルダ内のファイル取得
$listA = Get-ChildItem -Path $dirA -Recurse -Filter *.txt
#フォルダAでループ
foreach ($objA in $listA) {
$pathA = $objA.FullName
$pathB = changePath $dirA $dirB $pathA
$aryAllA += $pathA
if (Test-Path $pathB ) {
#ハッシュで比較する場合
$hashA = Get-FileHash $pathA
$hashB = Get-FileHash $pathB
if ($hashA.Hash -ne $hashB.Hash) {
#ファイルサイズで比較する場合
#$objB = Get-ItemProperty $pathB
#if ($objA.Length -ne $objB.Length) {
#ファイルコピー
Copy-Item $pathA $pathB -Force
Write-Output ("upd " + $pathB)
}
}
else {
#ファイルの属性を取得
$parent = Split-Path $pathB -Parent
if ((Test-Path $parent) -eq $false) {
New-Item $parent -itemType Directory
}
#ファイルコピー
Copy-Item $pathA $pathB
Write-Output ("copy " + $pathB)
}
}
■変更があったファイルだけ別フォルダにコピー
$dirA にコピー元フォルダを指定し、$dirB に比較するフォルダ、$dirC にコピー先フォルダを指定します。
#パス変更
function changePath($dirF, $dirT, $path) {
$name = $path.SubString($dirF.Length)
return $dirT + $name
}
#ファイルコピー
function copyFile($fromFile, $toFile) {
#ファイルの属性を取得
$parent = Split-Path $toFile -Parent
if ((Test-Path $parent) -eq $false) {
New-Item $parent -itemType Directory
}
#ファイルコピー
Copy-Item $fromFile $toFile
Write-Output ("copy " + $toFile)
}
#比較するフォルダ
$dirA = "C:\work\from"
$dirB = "C:\work\chk"
$dirC = "C:\work\to"
#フォルダ内のファイル取得
$listA = Get-ChildItem -Path $dirA -Recurse -Filter *.html
#フォルダAでループ
foreach ($objA in $listA) {
$pathA = $objA.FullName
$pathB = changePath $dirA $dirB $pathA
$pathC = changePath $dirA $dirC $pathA
$aryAllA += $pathA
if (Test-Path $pathB ) {
#ハッシュで比較する場合
$hashA = Get-FileHash $pathA
$hashB = Get-FileHash $pathB
if ($hashA.Hash -ne $hashB.Hash) {
#ファイルサイズで比較する場合
#$objB = Get-ItemProperty $pathB
#if ($objA.Length -ne $objB.Length) {
#ファイルコピー
copyFile $pathA $pathC
}
}
else {
#ファイルコピー
copyFile $pathA $pathC
}
}
ページのトップへ戻る