BenH's helpful answer 提供了一种有效的解决方案,可以直接在FileSize 函数内执行输出格式化。
或者,为了获得更大的灵活性,考虑重构您的方法,以便分离数据收集和输出格式方面/strong>:
首先,修改你的函数:
- 接受包含目标路径的文件作为参数
- 输出 custom 对象,这些对象的
.Path 属性包含手头的文件路径,.Size 属性包含作为 数字 的聚合大小(键入 @987654326 @。
Function FileSize {
param(
[string] $PathsFile
)
foreach ($path in Get-Content $PathsFile) {
[pscustomobject] @{
Path = $path
Size = (Get-ChildItem -File $path -Recurse | Measure-Object -Property Length -Sum -ErrorAction Stop).Sum
}
}
}
该函数的仅数据输出让您稍后决定如何格式化数据以及将其保存在哪里:
在ForEach-Object 通话中使用 BenH 的方法:
FileSize 'C:\path\path\path\path\paths2.txt' |
ForEach-Object { '{0} : {1:N2} GB' -f $_.Path, ($_.Size/1GB) }
您可以简单地附加> out.txt,例如,将输出保存在文件中;或者,通过管道到Out-File 或Set-Content 允许您使用-Encoding 参数控制输出文件的字符编码。
要为显示生成友好的表格输出,您可以使用calculated property 管道到Format-Table:
FileSize 'C:\path\path\path\path\paths2.txt' |
Format-Table Path, @{ n='Size'; e={ '{0:N2} GB' -f ($_.Size/1GB) } }
最后,为了进一步程序化处理,您可以通过管道将FileSize 输出导出到Export-Csv 和Export-CliXml 等cmdlet,甚至是ConvertTo-Json 等转换cmdlet。