我整理了一个脚本,该脚本以递归方式从一个目录复制到另一个目录,跳过文件名中具有特定模式的文件:
function Copy-RevitFiles ([string]$source, [string]$destination, [boolean]$recurse) { $pattern = '\.\d\d\d\d\.[RVT]' if ($recurse) {$files = Get-ChildItem $source -Recurse} else {$files = Get-ChildItem $source} $files | ForEach-Object { if ((Select-String -InputObject $_.Name -pattern $pattern -AllMatches -quiet) -eq $null) { #Write-Host $_.Name #Write-Host $_.Fullname #Write-Host "$($destination)\$($_.FullName.TrimStart($source))" Copy-Item $_.FullName -Destination "$($destination)\$($_.FullName.TrimStart($source))" #add on full name of item, less $source start end of file path #Write-Host "----------" } } }
在大多数情况下,它运作良好。我有的问题是,它在每个文件夹中都创建了一个额外的子文件夹,其中有文件。例如:
如果使用以下结构将源作为目录输入:
Source -file1.rvt -file1.0225.rvt (will not copy as it matches the pattern) -file1.0226.rvt (will not copy as it matches the pattern) -folder1 |-file2.rvt |-file2.0121.rvt (will not copy as it matches the pattern) |-file2.0122.rvt (will not copy as it matches the pattern) -folder2
我希望在目标文件夹中创建以下结构:
Destination -file1.rvt -folder1 |-file2.rvt -folder2
但是,我得到的是:
Destination -file1.rvt -folder1 |-file2.rvt |-folder1 (extra folder not in source) -folder2
知道我要去哪里哪里吗?
答案 0 :(得分:0)
这是构造目的地的方式,也是处理带有选项Select-STring
的{{1}} cmdlet的返回值的方式。
使用-Quiet
开关将使cmdlet返回一个布尔值($ true或$ false),但是您正在测试与Quiet
的相等性。
如果我使用$null
cmdlet(以及对功能的其他一些调整),则如下所示:
Join-Path
并根据您的function Copy-RevitFiles {
[CmdletBinding()]
Param(
[string]$source,
[string]$destination,
[string]$pattern,
[switch]$recurse
)
# test if the destination folder exists
if (!(Test-Path -Path $destination -PathType Container)) {
New-Item -ItemType Directory -Path $destination -Force | Out-Null
}
$files = Get-ChildItem $source -Recurse:$recurse
$files | ForEach-Object {
if (!(Select-String -InputObject $_.Name -Pattern $pattern -AllMatches -Quiet)) {
#Write-Host $_.Name
#Write-Host $_.Fullname
$target = Join-Path -Path $destination -ChildPath $_.Fullname.TrimStart($source)
#Write-Host "Copying '$_.Fullname' to '$target'"
$_ | Copy-Item -Destination $target
#Write-Host "----------"
}
}
}
示例使用它:
Source
它将导致:
Copy-RevitFiles -source "D:\Source" -destination "D:\Destination" -pattern '\.\d\d\d\d\.[RVT]' -recurse