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

Scr*_*key 2 powershell get-childitem

此链接指向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')
                }
Run Code Online (Sandbox Code Playgroud)

我选择了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

Tes*_*ler 5

这份文件

文件的大小等于 (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')
Run Code Online (Sandbox Code Playgroud)

并使长度计算更像文档链接:

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

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

为什么它要通过字符串格式转换为int64,以及如何正确完成它,我不知道,这主要是试验和错误,直到它工作.