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
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,以及应该如何正确完成,我不知道,这主要是反复试验,直到它起作用。
这个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
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,以及应该如何正确完成,我不知道,这主要是反复试验,直到它起作用。