递归复制与模式匹配的文件

时间:2019-03-05 05:16:40

标签: powershell

我整理了一个脚本,该脚本以递归方式从一个目录复制到另一个目录,跳过文件名中具有特定模式的文件:

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

知道我要去哪里哪里吗?

1 个答案:

答案 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