将文件从子文件夹数组移动到具有相同数组名称的新目录

时间:2014-03-18 23:58:19

标签: arrays powershell

使用powershell我想搜索包含1个名为incoming的文件夹的多个目录中的子文件夹数组,并使用与其源相同的文件夹名称将文件从传入移动到暂存区域。

IE:文件到达如下文件夹:

z:\ folder1 \ incoming \ file。*,z:\ folder2 \ incoming \ file。*,z:\ folder3 \ sub1 \ incoming \ file。*,z:\ folder3 \ sub2 \ incoming \ file。*等。

然后需要使用相同的文件夹结构移动到暂存区域:

\ nas \ staging \ folder1 \ incoming \ file。*,\ nas \ staging \ folder2 \ incoming \ file。*,\ nas \ staging \ folder3 \ sub1 \ incoming \ file。*,\ nas \ staging \ folder3 \ sub2 \ incoming \ file。* etc。

基本上我想从中提取的唯一子文件夹是包含带文件的“Incoming”文件夹的子文件夹。由于除了子文件夹“Incoming”之外没有预定义的文件夹名称,我需要遍历Z中的每个文件夹:。

非常感谢任何帮助或建议。

我能够想出这个,它有效地将文件夹结构除了“传出”移动到登台目录,这是很好的但是在我的环境中会有很多排除检查这种方式。如果需要,我是否有可能将文件从列表中移动到特定文件夹?

$from = 'C:\ftp'
$to = 'C:\staging'

$excludeMatch = @("Outgoing")
Get-ChildItem -Path $from -Recurse -Exclude $exclude |
      where { $excludeMatch -eq $null -or $_.FullName.Replace($from, "") -notmatch $excludeMatch } |
      Copy-Item -Destination {
        if ($_.PSIsContainer) {
          Join-Path $to $_.Parent.FullName.Substring($from.length)
        } else {
          Join-Path $to $_.FullName.Substring($from.length)
        }
       } -Force -Exclude $exclude  

1 个答案:

答案 0 :(得分:0)

Sooooo,我们需要的是,识别父目录被称为“传入”的任何文件?我能想到的至少有两种方法可以解决这个问题,但可能会有一个更简洁,更惯用的解决方案让我望而却步。

方法1 - 识别“传入”文件夹,然后复制内容

get-childitem -Path $from -recurse -Filter "incoming" |
    where-object { $_.PSIsContainer }

如果你使用PowerShell 3,我相信(读'未经测试')这可以缩短为

get-childitem -Path $from -recurse -Filter "incoming" -Directory

上述任何一个都应该产生一个'目录'对象流,所有这些对象都是'传入'文件夹。对于每个文件,将文件复制到适当的目的地。

方法2 - 识别所有文件,然后处理文件夹为“传入”的文件

get-childitem -path $from -recurse |
    where-object { -not $_.PSIsContainer } | 
    where-object { (Split-Path $_.Directory -Leaf) -eq "incoming" }

这会产生一个'文件'对象流,所有这些对象都在一个名为'incoming'的文件夹中。对于每一个,复制到适当的目的地。