トッカンソフトウェア

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
    }
}
				
				


ページのトップへ戻る