我编写了一个函数来解析文件的文件夹名称,并将它们存储为遇到的每个文件夹的注释属性,因此目录(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
}
答案 0 :(得分:0)
您需要知道导出的树中将有多少目录,以便您可以在对象上创建适当数量的属性Export-CSV
或csv文件不具有“右侧属性” “第一排。您的示例中的IE文件2将具有目录1..3,但不是4.我这样做的方式是将文件循环两次。第一次获取您将遍历的最大深度,第二次构造一个psobject并将其添加到一个数组,以便最后写入csv文件。
对于路径段少于最大路径段的文件,您需要为未填充的段指定空值或空值。此外,如果要包含其他属性,则应该在此目录树的左侧执行此操作。如果您不想要给定文件的属性,则仍需要将null / blank值传递到对象的属性中,否则。
下面的脚本创建了一个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