从概述的目录结构重建路径

时间:2014-05-24 11:40:26

标签: powershell multidimensional-array

我的格式为csv文件:

  

地址,L0,L1,L2,L3,L4

     

01,种类,,,,

     

01.01,哺乳动物,,,

     

01.01.01 ,,,临危,,

     

...

我想用它来创建匹配的目录结构。我是脚本和PowerShell的新手,在这种情况下,我不确定我是否完全走错了轨道。我应该使用单独的数组来存储每个级别的名称/地址对,然后使用像查找表这样的数组来构建路径吗?如果是这样,我想我会坚持如何根据行的地址设置if-thens。据我所知,总体战略的建议或类似问题的链接将非常受欢迎:

$folders = Import-Csv "E:\path\to\file.csv"

$folders | foreach {
$row = new-object PSObject -Property @{
    Address = $_.Address;
    Level = ([regex]::Matches($_.Address, "\." )).count;
    L0 = $_.L0
    L1 = $_.L1
    L2 = $_.L2
    L3 = $_.L3
    }
$array += $row
}

#top level directories
$0 = $array | ?{$_.Level -eq 0} |
Select-Object @{n="Address";e={$_.Address;}},@{n="Name";e={$_.L0}}
#2nd level directories
$1 = $array | ?{$_.Level -eq 1} | 
Select-Object @{n="Number";e={$_.Address.split(".")[-1];}},@{n="Name";e={$_.L1}}

2 个答案:

答案 0 :(得分:0)

未经测试,但我认为这可能会做你想要的:

$root = 'E:\SomeDirName'

Switch -Regex (Get-Content "E:\path\to\file.csv")
{
 '^01,(\w+),,,,$' { $L1,$L2,$L3,$L4 = $null; $L0=$matches[1];mkdir "$root\$L0" }
 '^01\.01,,(\w+),,,$'  { $L1=$matches[1];mkdir "$root\$L0\$L1" }
 '^01\.01\.01,,,(\w+),,$'  { $L2=$matches[1];mkdir "$root\$L0\$L1\$L2" }
 '^01\.01\.01\.01,,,,(\w+),$' { $L3=$matches[1];mkdir "$root\$L0\$L1\$L2\$L3" }
 '^01\.01\.01\.01\.01,,,,,(\w+)$' { $L4=$matches[1];mkdir "$root\$L0\$L1\$L2\$L3\$L4" }
 }

答案 1 :(得分:0)

为了解决这类问题,经常使用一种称为递归的编程概念。

简而言之,递归函数是一个自我调用的函数。

我用CSV输入成功测试了这段代码:

$csvPath = 'C:\Temp\test.csv'
$folderRoot = 'C:\Temp'

$csv = Import-Csv $csvPath -Delimiter ',' | Sort-Object -Property Address

# Recursive function
function Recurse-Folder( $folderAddress, $basePath )
{
    # Getting the list of current folder subfolders
    $childFolders = $null
    if( $folderAddress -like '' )
    {
        $childFolders = $csv | Where-Object { $_.Address -like '??' }
    }
    else
    {
        $childFolders = $csv | Where-Object { $_.Address -like $( $folderAddress + '.??' ) }
    }

    # For each child folder
    foreach( $childFolder in $childFolders )
    {
        # Get the folder name
        $dotCount = $childFolder.Address.Split('.').Count - 1
        $childFolderName = $childFolder.$('L'+$dotCount)

        if( $childFolderName -ne '')
        {
            $childFolderPath = $basePath + '\' + $childFolderName

            # Creating child folder and calling recursive function for it
            New-Item -Path $childFolderPath -ItemType Directory
            Recurse-Folder $childFolder.Address $childFolderPath
        }
    }

}

Recurse-Folder '' $folderRoot