PowerShell "get-childitem2" 大小超过 ~3.5gb

PowerShell "get-childitem2" size over ~3.5gb

这个link指向Get-Childitem2,一个允许遍历260个字符限制的函数。

https://gallery.technet.microsoft.com/scriptcenter/Get-ChildItemV2-to-list-29291aae#content.

这是一个非常棒的功能,效果非常好,但是,它会误报超过 ~3.5GB 的文件大小,这就是我 运行 它的全部原因。 我很痛苦地承认我只是不够好,无法找到并修复代码,因此它可以准确报告超过 ~3.5GB 的文件大小。

我想它就在这儿;因为似乎没有 'nFileSizeHigh' 选项:

                    } Else {
                    $Object.Length = [int64]("0x{0:x}" -f $findData.nFileSizeLow)
                    $Object.pstypenames.insert(0,'System.Io.FileInfo')
                }

我选择了这个而不是 Robocopy 和 AlphaFS,因为我在这两个方面都遇到过各种问题。 文件大小问题示例:

get-childitem C:\Temp\Huge:(正确的字节大小)

3166720000 - sp1_vl_build_x64_dvd_617403.iso
5653628928 - server_2016_x64_dvd_9327751.iso
4548247552 - it_English_-3_MLF_X19-53588.ISO

get-childitem2 C:\Temp\Huge:

3166720000 - sp1_vl_build_x64_dvd_617403.iso
1358661632 - server_2016_x64_dvd_9327751.iso
253280256 - it_English_-3_MLF_X19-53588.ISO

来自this documentation

The size of the file is equal to (nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow

并且在脚本的顶部(第 92 行)提到了 nFileSizeHigh,但没有尝试将其添加到文件长度中。所以我只能猜测脚本有问题并且没有在大于 [DWORD MAX] 的文件上进行测试,即 [uint32]::MaxValue,或大约 3.5GB。

如果将顶部的两行更改为 [uint32] 而不是 [int32]:

        [void]$STRUCT_TypeBuilder.DefineField('nFileSizeHigh', [uint32], 'Public')
        [void]$STRUCT_TypeBuilder.DefineField('nFileSizeLow', [uint32], 'Public')

并使长度计算更像文档 link:

$Object.Length = ($findData.nFileSizeHigh * ([uint32]::MaxValue+1)) + ([int64]('0x{0:x}' -f $findData.nFileSizeLow))

然后它在我的快速测试中正确处理了 ~7GB 的文件。

为什么要通过字符串格式化转换为 int64,以及应该如何正确完成,我不知道,这主要是反复试验,直到它起作用。