Как скопировать директорию со всеми подпапками сверяя контрольную сумму для каждого файла?

Приветствую, друзья!

Подскажите, пожалуйста, как скопировать директорию со всеми подпапками сверяя контрольную сумму для каждого скопированного файла? Работа по Win.
  • Вопрос задан
  • 117 просмотров
Решения вопроса 3
@BeatHazard
Для решения вашей задачи рекомендую использовать Powershell.
Накидал вот такой скрипт, думаю он вам поможет.

$OldFolder = "C:\Temp" #папка с исходными файлами
$NewFolder = "C:\test\test" # папка куда будут копироваться файлы
$files = Get-ChildItem $OldFolder -File -Recurse
foreach ($file in $files )
{
$folder = "$NewFolder$(Split-Path $file.DirectoryName -NoQualifier)"
if (-not (Test-Path $folder)) {New-Item $folder -Force -ItemType Directory}
Copy-Item $file.fullname $folder -Force
$MD5 = Get-FileHash -Path $file.fullname -Algorithm MD5
$MD5New = Get-FileHash -Path "$folder\$file" -Algorithm MD5
if ($MD5.Hash -ne $MD5New.Hash)
{Write-Host "Внимание!!! Хэш нового файла $folder\$file не соответствует исходному!!!" -ForegroundColor Red
Read-host "Нажмите Enter чтобы продолжить"
}
}
Ответ написан
wisgest
@wisgest
Слесарь холодной обработки металла
Контрольные суммы для каждого файла уже вычислены и где-то хранятся? Нет? Вы хотите их рассчитывать на ходу? Это лишняя работа. Проще сравнивать источник с копией. Обратите внимание на ключ /V утилиты XCOPY.
Ответ написан
@azarij
В меру опытный никто
у меня вот так получилось. пошловато местами и паузу по обнаружении несходяшихся хэшей я честно стащил у Евгения. если будете пользоваться, протестируйте сначала на датасете, который готовы потерять. ;)

$source_path = "D:\TOOLS"
$destination_path = "E:\TOOLS"

Copy-Item -Path "$source_path\*" -Recurse -Destination $destination_path -Force

$source_path_list = Get-ChildItem $source_path -Force -File -Recurse


$problematic_files = $null
foreach($file in $source_path_list)
{
      
    $source_filehash = Get-FileHash -Algorithm MD5 $file.FullName #тут была ошибка
    $destination_filehash = Get-FileHash -Algorithm MD5 ($file.FullName -replace "^D:","E:") #вот так делать просто низко!

    if($source_filehash.Hash -eq $destination_filehash.Hash)
    {

        write-host $file.FullName -ForegroundColor Green
    }
    else
   {
        write-host "Source and destination hashes for $($file.FullName) do not match!" -ForegroundColor Red
        Read-host "Нажмите Enter чтобы продолжить"
        $problematic_files += $file.FullName
    }


}

"Problematic files detected: $problematic_files"


а еще, есть такая штука ххкопи. она может побитово сверять скопированное. может занять очень много времени на больших датасетах.
xxcopy.com/xxtb_027.htm#tag_319
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы