Ошибка расчета общего размера файла с помощью функции Copy-WithProgress Powershell - PullRequest
0 голосов
/ 28 сентября 2018

Я принял сценарий PowerShell Copy-WithProgress, написанный Тревором Салливаном (спасибо!), Но некоторые вычисления, похоже, не работают, когда более 8000 файлов возвращают 3PB, а 5000 файлов возвращают 7Bytes.

Я использую следующие параметры Robocopy для своего «промежуточного журнала»:

$CommonRobocopyParams = '/MIR /S /NP /NDL /NC /BYTES /NJH /NJS /R:1 /W:1'

И использую следующее для чтения журнала для вычисления копируемых байтов:

$BackupLog = 'C:\Users\username\Desktop\Backup_2018-09-20-112849'
$StagingLogPath = '{0}\robocopy staging.log' -f $BackupLog
$StagingContent = Get-Content -Path $StagingLogPath | ? {$_} #Skip blank lines in log
$TotalFileCount = $StagingContent.Count                    

Write-Host "Number of selected files to be copied: $TotalFileCount."

$RegexBytes = '(?<=\s+)\d+(?=\s+)' 

[RegEx]::Matches(($StagingContent -join "`n"), $RegexBytes) | % { $BytesTotal = 0 } { $BytesTotal += $_.Value }

$message = 'Total number of bytes to be copied: {0:N0}' -f ($BytesTotal/1GB)
Write-Host $message 

Приведенный выше «Пропуск пустых строк в журнале» предназначен для обработки другого набора журналов из другой папки, т. Е. Документов в том же файле «промежуточного журнала», разделенных пустой строкой.

Скрипт неверно рассчитывает 1 из6 машин, которые я тестировал, и только при резервном копировании рабочего стола на проблемной машине.Я проверил «промежуточный журнал» и сравнил его с правильными расчетными журналами, которые выглядят так:

13162   C:\Users\username\Desktop\File 1.xlsx           
1765924 C:\Users\username\Desktop\File 2.xlsx           
68838   C:\Users\username\Desktop\File 3.pdf            
2380    C:\Users\username\Desktop\File 4.docx           
403759  C:\Users\username\Desktop\File 5.txt            
10068   C:\Users\username\Desktop\File 6.xlsx           
28502   C:\Users\username\Desktop\File 7.jpg            
139277  C:\Users\username\Desktop\File 8.docx           
553469  C:\Users\username\Desktop\File 9.log            
283502  C:\Users\username\Desktop\Book1.xlsx            

Мне любопытно, столкнулся ли кто-нибудь с этой проблемой и решил ее.Заранее спасибо!

1 Ответ

0 голосов
/ 28 сентября 2018

Почти наверняка Подводный камень в том, что вы используете System.Int32.Для действительно больших чисел эта математика потерпит неудачу.

Рассмотрим что-нибудь, поддерживающее большие числа, такие как [int64], [long] или [double].Например, (1pb).GetType().FullName nets System.Int64

% { [int64]$BytesTotal = 0 }

Этого одиночного приведения при инициализации должно быть достаточно, чтобы исправить любые просчеты вниз по линии.

Для игры в кости и смеха вы можете посмотреть на мою Copy-WithRobocopyProgress функцию на GitHub, если вы так склонны.Использует задания и robocopy для отображения прогресса в PowerShell

...