我正在尝试移动除特定类型文件之外的所有项目。在这种情况下* .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)}
}
答案 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
,这是用户的“我的文档”文件夹的路径。