【问题标题】:File size total calculation issue using Copy-WithProgress Powershell function使用 Copy-WithProgress Powershell 函数的文件大小总计算问题
【发布时间】:2018-09-28 08:39:40
【问题描述】:

我采用了由Trevor Sullivan 编写的 PowerShell 脚本 Copy-WithProgress(谢谢!),但有些计算似乎不正确,超过 8,000 个文件返回 3PB,5,000 个文件返回 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 

上面的“跳过日志中的空白行”是为了处理来自另一个文件夹的另一组日志,即同一个“暂存日志”文件中的文档,用空行分隔。

脚本在我测试过的 6 台机器中有 1 台计算不正确,并且仅在问题机器上备份桌面时。我检查了“暂存日志”并将其与正确的计算结果进行了比较,如下所示:

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            

我很好奇是否有人遇到过这个问题并解决了这个问题。提前谢谢!

【问题讨论】:

    标签: powershell robocopy


    【解决方案1】:

    很确定这里的陷阱是你使用System.Int32。对于非常大的数字,数学会失败。

    考虑支持更大数字的东西,例如[int64]、[long] 或[double]。例如(1pb).GetType().FullName nets System.Int64

    % { [int64]$BytesTotal = 0 }

    初始化时的单一转换应该足以解决任何错误计算。

    如果您愿意的话,可以查看我在 GitHub 上的 Copy-WithRobocopyProgress 功能。使用作业和 robocopy 在 PowerShell 中显示进度

    【讨论】:

    • 感谢您的回复。我已经尝试过这 3 种演员类型,但结果是一样的——我应该在我的原始帖子中加入。我会看看你的 Robocopy 功能是否有任何逻辑可以集成到我现有的代码中 - 谢谢你的分享。一旦我弄清楚了,我会更新这篇文章。
    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多