需要帮助将脚本输出导出到csv

时间:2015-06-12 18:02:57

标签: powershell csv

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。每次我收到错误“不允许空管元素。”

1 个答案:

答案 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