如何格式化来自ForEach的PowerShell结果

问题描述

我试图完整地请求一个目录中文件数量的请求,然后再请求该目录的总大小。我想出了这个:

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\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标志允许您添加到现有文件中,而不是覆盖。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...