PowerShell“;get-childitem2“;大小超过~3.5gb

PowerShell“;get-childitem2“;大小超过~3.5gb,powershell,get-childitem,Powershell,Get Childitem,此链接指向Get-Childitem2,该函数允许遍历260个字符的限制 这是一个非常好的函数,工作得非常好,但是,它误报了超过~3.5GB的文件大小,这就是我运行它的全部原因。 我煞费苦心地承认,我只是不够好,无法找到并修复代码,因此它可以准确地报告超过~3.5GB的文件大小 我想它就在这里的某个地方;由于似乎没有“nFileSizeHigh”选项: } Else { $Object.Length = [int6

此链接指向Get-Childitem2,该函数允许遍历260个字符的限制

这是一个非常好的函数,工作得非常好,但是,它误报了超过~3.5GB的文件大小,这就是我运行它的全部原因。 我煞费苦心地承认,我只是不够好,无法找到并修复代码,因此它可以准确地报告超过~3.5GB的文件大小

我想它就在这里的某个地方;由于似乎没有“nFileSizeHigh”选项:

                    } Else {
                    $Object.Length = [int64]("0x{0:x}" -f $findData.nFileSizeLow)
                    $Object.pstypenames.insert(0,'System.Io.FileInfo')
                }
我选择了这个,而不是Robocopy和AlphaFS,因为两者都有很多问题。 文件大小问题示例:

获取子项C:\Temp\maging:(字节大小正确)

3166720000-sp1_vl_build_x64_dvd_617403.iso
5653628928-服务器_2016_x64_dvd_9327751.iso
4548247552-it_English_-3_MLF_X19-53588.ISO

get-childitem2 C:\Temp\maging:

3166720000-sp1_vl_build_x64_dvd_617403.iso
1358661632-服务器_2016_x64_dvd_9327751.iso
253280256-it_English_-3_MLF_X19-53588.ISO

文件大小等于
(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')
并使长度计算更像文档链接:

$Object.Length = ($findData.nFileSizeHigh * ([uint32]::MaxValue+1)) + ([int64]('0x{0:x}' -f $findData.nFileSizeLow))
然后在我的快速测试中,它能正确处理~7GB的文件


为什么要通过字符串格式转换为int64,以及如何正确转换,我不知道,在它工作之前,这主要是反复试验。

[uint64]$hi-shl 32-bor[uint64]$low
似乎足够了。@wOxxOm它不-
无法将值“-2126708477”转换为“System.uint64”类型。错误:“UInt64的值太大或太小。”
运行良好,并正确报告了43.7GB PST文件。在PS5+Win7或更新版本中,您可以使用UNC hack:
gci-literal“\\?\d:\path”-filter*.iso-r
,它将处理超过4GB的超长路径和大小。