如何格式化ForEach中的PowerShell结果



我正在尝试完成一个目录中文件数量的请求,然后是该目录的总大小。我想出了这个:

Get-Content -Path C:Users$USERNAME%Documentslist.txt |
Foreach-Object {
cd $_
Write-Host $_ 
(Get-ChildItem -Recurse -File | Measure-Object).Count 
(ls -r|measure -sum Length).Sum
}

txt文件包含以下内容:

\directoryonnetwork1
\directoryonnetworkalso

最终,我需要在电子表格中这样做,但我在格式化方面失败了。按原样,它直接输出到powershell,因此对于成千上万的目录来说,这并不理想。我曾尝试导出到CSV,但它会用每个结果覆盖CSV,当我尝试将函数设置为变量数组,然后导出时,它只会输出一个空白文件。

如有任何协助,我们将不胜感激。

为了导出到CSV,您需要一个具有属性的对象。您的代码生成一些没有任何结构的值。当然,您的示例代码中的%是一个拼写错误,它绝对不属于那里。在脚本中使用别名通常被认为是不好的做法,但您至少应该保持它的一致性。一行使用Get-ChildItem/Measure-Object,下一行使用ls/measure。不管怎样,你都没有展示你的出口,所以很难帮助我们解决我们看不到的问题。您也不需要CD进入目录,这似乎只会减慢脚本的速度。

我知道创建对象最简单的方法是使用[PSCustomObject]类型的加速器。

$infile = "C:Users$USERNAMEDocumentslist.txt"
$outfile = "C:somepathto.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标志允许您添加到现有文件中,而不是覆盖。

最新更新