1

我编写了一个函数来解析文件的文件夹名称并将它们存储为遇到的每个单独文件夹的注释属性,因此 directory(n) = direcory1, directoryn+1= directory2 等...所以对于每个文件的目录根据文件在目录结构中的位置,长度会有所不同。

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

示例 File1
目录 1、目录 2、目录 3、其他属性
目录值 1、目录值 2、目录值 3

File2
目录 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

}
4

1 回答 1

0

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

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

下面的脚本创建一个 csv 文件,例如: 在此处输入图像描述 从您在帖子中解释的目录结构。

$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 
于 2018-05-18T21:02:03.160 回答