如何格式化 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
我正在尝试完成一个目录中文件数量的请求,然后是该目录的总大小。我想出了这个:
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