我found a script给我一个目录中每个子文件夹的大小。
问题是我不知道在哪里放export-csv
命令来获取CSV中的输出。
作为奖励,如果可能的话,我还想向这些子文件夹添加lastmodified
属性。但我意识到完全可能需要一个不同的脚本。
这是脚本:
$startFolder = "C:\Scripts"
$colItems = (Get-ChildItem $startFolder | Measure-Object -property length -sum)
"$startFolder -- " + "{0:N2}" -f ($colItems.sum / 1MB) + " MB"
$colItems = (Get-ChildItem $startFolder -recurse | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object)
foreach ($i in $colItems)
{
$subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property length -sum)
$i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB"
}
我尝试在括号内外两端添加| export-csv c:\path
。我也尝试在脚本命令之后添加它,即c:\script.ps1 | export-csv
。每次我收到错误“不允许空管元素。”
答案 0 :(得分:2)
如果要使用管道处理foreach
循环的输出,则必须在变量中收集其输出:
$results = foreach ($i in $colItems) {
...
}
$results | Export-Csv 'C:\path\to\your.csv' -NoType
或在表达式中运行(即在括号中):
(foreach ($i in $colItems) {
...
}) | Export-Csv 'C:\path\to\your.csv' -NoType
但是,我个人更喜欢ForEach-Object
而非foreach
循环(两者之间的差异见here),因为前者确实适用于管道:
Get-ChildItem $startFolder -recurse |
Where-Object {$_.PSIsContainer -eq $True} |
Sort-Object |
ForEach-Object {
...
} |
Export-Csv 'C:\path\to\your.csv' -NoType
话虽如此,你可能不想要一个循环。 Export-Csv
cmdlet处理对象列表,并将输入对象的属性作为字段写入CSV文件。由于您已经有对象输入,因此您只需选择要导出的属性:
Get-ChildItem $startFolder -recurse |
Where-Object {$_.PSIsContainer -eq $True} |
Sort-Object |̣
Select-Object FullName, LastWriteTime |
Export-Csv 'C:\path\to\your.csv' -NoType
可以添加自定义属性,例如calculated properties:
Get-ChildItem $startFolder -recurse |
Where-Object {$_.PSIsContainer -eq $True} |
Sort-Object |̣
Select-Object FullName, LastWriteTime, @{n='FolderSize';e={
Get-ChildItem $_.FullName |
Measure-Object -Property Length -Sum |
Select-Object -Expand Sum
}} |
Export-Csv 'C:\path\to\your.csv' -NoType