2016-08-09 214 views
0

我一直在研究一个PowerShell脚本,它可以在拼装嵌套文件夹时保留目录结构。尽管如此,我很难获得递归逻辑。递归逻辑

这是一个粗略的,所以没有任何try/catch错误代码呢。我已将Remove-Item注释掉以防止意外运行。

我为此制定的逻辑如下。

  • 检查& GET基地树子目录
  • 转到上一级,再
  • 检查继续,直到没有目录,然后返回一个级别。
  • Cab目录,删除目录,写入自动提取日志(子目录cabs的文件名)。
  • 重复过程中一个新的水平,并继续到基本目录
function Chkfordir ($clevel) 
{ 
    $dir = dir $clevel | ? { $_.PSIsContainer -eq $true } #Does Current Level have Folders? 
    if($dir -ne $null) # Yes 
    { 
     Chkfordir $dir  #Go Deeper 
    } 
    if ($dir -eq $null) #Deepest Branch 
    { 
     return    # Go Back One Level and begin Cabbing 
    } 

    $dir | % { 
     Compress-Directory $_.FullName (".\" + [string]$_.Name + ".cab") 
     echo ($_.FullName + ".cab" >> .\cleaf.log" 
     #Remove-Item -Recurse $_.FullName 
     return 
    } 
} 

函数调用Compress-Directoryhere

编辑改变:

将重新邮编顺(08/18)

编辑08/18于是,我终于有机会来测试它和逻辑上似乎现在的工作。有一些问题。

大部分困难都伴随着PowerShell的问题和Compress-Directory不独立于路径的未被注意的问题。看起来我以后需要重新编写这个函数以实现路径独立。

PowerShell的问题出现在管道上的某个值的类型更改中。显然,从函数目录返回后,使用不同名称的成员函数将项目从System.IO.FileInfo更改为System.IO.DirectoryInfo。

由于重定向操作符在PowerShell中不起作用,Echo被添加内容替换。

还有一些不明的状态与之对抗。没有文件的叶目录会导致Compress-Directory出错或完全静默,不创建文件(因此不保留层次结构)。

解决方案是在返回之前为叶文件夹添加Add-Content,并将Add-Content移动到Compress-Directory之前,以便每个目录至少有一个文件。

我已经在下面包含了我的当前版本,但它是一项正在进行的工作。

function Chkfordir ($clevel) 
{ 
    $dir = dir $clevel | ? { $_.PSIsContainer -eq $true } # Get Folders? 
    if ($dir -eq $null) { #Check if deepest branch 
     Add-Content (Join-Path $_.PSPath "\leaf.log") ([string]$_.FullName + ".cab") 
     return $_    # Return one level up and cab 
    } 

    $dir | % { #for each sub go deeper 
     Chkfordir $_.FullName 
     Add-Content (Join-Path $_.PSParentPath "\branch.log") ([string]$_.FullName + ".cab") 
     Compress-Directory $_.FullName ([string]$_.Name + ".cab") 
     #Remove-Item $_.FullName -recurse 
    }   
} 

回答

0

您需要的递归调用返回后改乘每个子目录,并压缩它:

function Chkfordir($clevel) { 
    Get-ChildItem $clevel | 
     Where-Object { $_.PSIsContainer } | 
     ForEach-Object { 
      Chkfordir $_ 
      Compress-Directory ... 
      ... 
     } 
} 

这样,你会自动下降,然后再创建档案,你回来。

+0

谢谢,我没有注意到,它没有采取每个子目录,并从那里递归。我已经更新了代码,我将在今天晚些时候测试它,当我有一些时间的时候。 – Lorek