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
从这份文件
文件的大小等于
(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,以及如何正确完成它,我不知道,这主要是试验和错误,直到它工作.