如何格式化 ForEach 的 PowerShell 结果

How to format PowerShell results from ForEach

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

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
    }

txt文件内容如下:

\directory\on\network
\directory\on\network\also

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

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

Export-Csv 中的 -append 标志允许您添加到现有文件而不是覆盖。

要导出为 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