问题描述
我试图完整地请求一个目录中文件数量的请求,然后再请求该目录的总大小。我想出了这个:
Get-Content -Path C:\Users\$USERNAME%\Documents\list.txt |
Foreach-Object {
cd $_
Write-Host $_
(Get-ChildItem -Recurse -File | Measure-Object).Count
(ls -r|measure -sum Length).Sum
}
\\directory\on\network\1
\\directory\on\network\also
最终,我需要在电子表格中使用它,但是格式化失败。照原样,它直接输出到powershell,因此对于成千上万个目录,这不是理想的选择。我尝试导出为CSV,但是它会用每个结果覆盖CSV,当我尝试将函数设置为等于变量数组然后导出时,它只会输出一个空白文件。
在此方面提供的任何帮助。
解决方法
要导出为CSV,您将需要一个具有属性的对象。您的代码会生成一些没有任何结构的值。当然,示例代码中的%
是一个错字,它绝对不属于错字。通常,在脚本中使用别名被认为是不好的做法,但是您至少应保持别名的一致性。一行使用Get-ChildItem/Measure-Object
,下一行使用ls/measure
。无论您不显示出口,都很难为我们看不到的东西提供帮助。您也不需要CD
进入目录,似乎只会降低脚本的速度。
我知道创建对象的最简单方法是使用[PSCustomObject]
类型的加速器。
$infile = "C:\Users\$USERNAME\Documents\list.txt"
$outfile = "C:\some\path\to.csv"
Get-Content -Path $infile |
Foreach-Object {
Write-Host Processing $_
[PSCustomObject]@{
Path = $_
Total = (Get-ChildItem $_ -Recurse -File | Measure-Object).Count
Size = (Get-ChildItem $_ -Recurse -File | Measure-Object -sum Length).Sum
}
} | Export-Csv $outfile -NoTypeInformation
编辑
我们应该运行一次Get-Childitem
调用,然后再提取信息。第一个选项处于“管道”模式,可以节省内存使用量,但速度可能较慢。第二个将所有内容都放在内存中,因此如果它不太大,它可以更快。
Get-Content -Path $infile |
Foreach-Object {
Write-Host Processing $_
$files = Get-ChildItem $_ -Recurse -File | Measure-Object -sum Length
[PSCustomObject]@{
Path = $_
Total = $files.Count
Size = $files.Sum
}
} | Export-Csv $outfile -NoTypeInformation
或
$results = foreach($folder in Get-Content -Path $infile)
{
Write-Host Processing $folder
$files = Get-ChildItem $folder -Recurse -File | Measure-Object -sum Length
[PSCustomObject]@{
Path = $folder
Total = $files.Count
Size = $files.Sum
}
}
$results | Export-Csv $outfile -NoTypeInformation
,
Export-Csv中的-append标志允许您添加到现有文件中,而不是覆盖。