Move-Item -Exclude -Recursive不会在子目录中保留已排除的项目

时间:2014-05-13 17:19:41

标签: powershell

我正在尝试移动除特定类型文件之外的所有项目。在这种情况下* .msg。如果排除的文件位于父文件夹中,它会很好。但是,当相同类型的文件位于子目录中时,它无法将文件保留在原位,而是将其移动到新位置。

username = Get-Content '.\users.txt'
foreach ($un in $username)
{
  $destA = "c:\users\$un\redirectedfolders\mydocuments"
  $destB = "c:\users\$un\redirectedfolders\desktop"
  $sourceA = "C:\users\$un\mydocuments"
  $sourceB = "C:\users\$un\desktop"

  New-Item -ItemType Directory -Path $destA, $destB

  Get-ChildItem $sourceA -Exclude '*.msg' -Recurse | Move-Item -Destination {Join-Path $destA $_.FullName.Substring($sourceA.length)}
  Get-ChildItem $sourceB -Exclude '*.msg' -Recurse | Move-Item -Destination {Join-Path $destB $_.FullName.Substring($sourceB.length)}
}

1 个答案:

答案 0 :(得分:0)

这是由于Get-ChildItem排除过滤器完成的过滤。这是一个已知问题,如果你真的想要我可能会挖掘一些参考文档,但可能需要一些时间。无论如何,GCI在过滤事物方面都不能很好地处理通配符。你可能最好做的是把它管道到这样的Where命令:

$username = Get-Content '.\users.txt'
foreach ($un in $username)
{
  $destA = "c:\users\$un\redirectedfolders\documents"
  $destB = "c:\users\$un\redirectedfolders\desktop"
  $sourceA = "C:\users\$un\documents"
  $sourceB = "C:\users\$un\desktop"

  New-Item -ItemType Directory -Path $destA, $destB
  GCI $sourceA -recurse | ?{$_.Extension -ne ".msg" -and !$_.PSIsContainer} | %{
    $CurDest = Join-Path $destA $_.FullName.Substring($sourceA.length)
    If(!(Test-Path $CurDest.SubString(0,$CurDest.LastIndexOf("\")))){New-Item -Path $CurDest -ItemType Directory|Out-Null}
    $_ | Move-Item -Destination $CurDest
  }
  GCI $sourceB -recurse | ?{$_.Extension -ne ".msg" -and !$_.PSIsContainer} | %{
    $CurDest = Join-Path $destB $_.FullName.Substring($sourceB.length)
    If(!(Test-Path $CurDest.SubString(0,$CurDest.LastIndexOf("\")))){New-Item -Path $CurDest -ItemType Directory|Out-Null}
    $_ | Move-Item -Destination $CurDest
  }
}

编辑:好的,现在排除文件夹,并保留文件夹结构 Edit2:重新设计为对文件执行ForEach循环,将目标路径构建为$CurDest,测试以确保它存在,如果不存在则进行测试,然后移动文件。还将mydocuments更改为documents,这是用户的“我的文档”文件夹的路径。