【问题标题】:How to output jagged noteproperty values using Export-csv powershell如何使用 Export-csv powershell 输出锯齿状的 noteproperty 值
【发布时间】:2018-05-18 13:30:49
【问题描述】:

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

我面临的问题是如何使用 Export-csv 结合其他静态属性值以列格式输出锯齿状目录结果,因为 noteproperty 长度会因文件而异(锯齿状)我正在努力弄清楚尝试以 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

}

【问题讨论】:

标签: powershell export-csv


【解决方案1】:

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

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

下面的脚本会创建一个 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 

【讨论】:

  • 谢谢布兰登,我想我看错了。我将 noteproperty 附加到实际文件 obj 而不是创建新的 obj。我总是在这个网站上学到新东西。
  • 我喜欢创建一个新对象,因为您可以更确定它的结构。我相信您可以通过使用文件对象将其编写为更少的代码行(并且更少的内存密集型),但我个人的偏好是使用我的 PS 脚本更冗长且效率可能更低,因为其他人更容易遵循他们到底在做什么。我的回答足以回答你的问题吗?如果是,请您将其标记为答案,或者让我知道什么不起作用。
猜你喜欢
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多