如何使用Export-csv powershell输出锯齿状的noteproperty值

时间:2018-05-18 13:30:50

标签: powershell export-csv

我编写了一个函数来解析文件的文件夹名称,并将它们存储为遇到的每个文件夹的注释属性,因此目录(n)= direcory1,directoryn + 1 = directory2等...所以对于每个文件的目录(s)将是各种长度,具体取决于文件在目录结构中的位置。

我面临的问题是如何使用Export-csv结合其他静态属性值以列格式输出锯齿状目录结果,因为noteproperty长度因文件而异(Jagged)我正在努力弄清楚尝试以csv格式输出目录列格式的逻辑。 输出应该包含如下标题:

示例文件1 目录1,目录2,目录3,其他属性
目录值1,目录值2,目录值3

文件2
目录1,目录2,目录3,目录4
目录值1,目录值2,目录3,目录4

function Get-Folder ($Files)
{

foreach ($file in $Files)
{
    $TotalDirLvl = ($file.FullName.Split('\').count)-1

    $x =0

    While($x -lt $TotalDirLvl){
        $file|Add-Member -NotePropertyName Directory$x -NotepropertyValue 
        $file.FullName.Split('\')[$x]
        $x++
    }
}
Return $Files

}

1 个答案:

答案 0 :(得分:0)

您需要知道导出的树中将有多少目录,以便您可以在对象上创建适当数量的属性Export-CSV或csv文件不具有“右侧属性” “第一排。您的示例中的IE文件2将具有目录1..3,但不是4.我这样做的方式是将文件循环两次。第一次获取您将遍历的最大深度,第二次构造一个psobject并将其添加到一个数组,以便最后写入csv文件。

对于路径段少于最大路径段的文件,您需要为未填充的段指定空值或空值。此外,如果要包含其他属性,则应该在此目录树的左侧执行此操作。如果您不想要给定文件的属性,则仍需要将null / blank值传递到对象的属性中,否则。

下面的脚本创建了一个csv文件,如: enter image description here 从您在帖子中解释的目录结构。

$files = Get-ChildItem -Path "$env:temp\SO" -Recurse | where { ! $_.PSIsContainer }
$outObjs = @()
$maxDepth = 0
foreach ($file in $files) { 
    $TotalDirLvl = ($file.FullName.Split('\').count)-1
    if ($TotalDirLvl -gt $maxDepth){
        $maxDepth = $TotalDirLvl
    }
}
foreach($file in $files){
    $outObj = New-Object PSObject
    $fileDepth = ($file.FullName.Split('\').count)-1
    $outObj | Add-Member -NotePropertyName DirectoryDepth -NotepropertyValue $fileDepth
    $x = 0
    #Add other properties for each file here to the left of your directory tree
    While($x -le $maxDepth)
    {
        if ($x -gt $fileDepth){
            $value = ''
        }
        else{
            $value = $file.FullName.Split('\')[$x]
        }
        $outObj | Add-Member -NotePropertyName "Directory$x" -NotepropertyValue $value

        $x++
    }
    $outOBjs += $outObj
}

$outOBjs | Export-Csv -Path "$env:temp\SO\test.csv" -NoTypeInformation -Force