当前位置: 首页 > 知识库问答 >
问题:

递归复制模式匹配的文件

葛成双
2023-03-14

我编写了一个脚本,可以递归地从一个目录复制到另一个目录,跳过文件名中具有特定模式的文件:

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

微生嘉
2023-03-14

这是构建目的地的方式,也是使用option-Quiet处理Select-STring cmdlet返回值的方式
使用Quiet开关将使cmdlet返回布尔值($true或$false),但您正在测试是否等于null。

如果我像这样使用Join-Pathcmdlet(以及对您的函数的一些其他调整):

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 "----------"
        }
    }
}

并根据您的源代码使用它,例如:

Copy-RevitFiles -source "D:\Source" -destination "D:\Destination" -pattern '\.\d\d\d\d\.[RVT]' -recurse

这将导致:

Destination
|   file1.rvt
|
+---folder1
|       file2.rvt
|
\---folder2
 类似资料:
  • 我有一个文本文件,其中包含2行样本DNA序列,使用,我想找到与“CCC”匹配的模式,特别是跨越多行的模式(见下面test.txt中第1行末尾到第2行开头)。 测试.txt: 使用命令: 返回: 它似乎正确地突出了第1行中的2个C,然而,它突出了第2行中的第一个C,然后继续完全打印出第二行;给我一个C的复制品。 我在这里做错了什么,我怎样才能避免第二行中重复的C?

  • 本文向大家介绍OCaml 具有模式匹配的递归列表处理,包括了OCaml 具有模式匹配的递归列表处理的使用技巧和注意事项,需要的朋友参考一下 示例 在这里,我们演示了如何使用OCaml的模式匹配语法来递归处理列表。 在这种情况下,模式[]匹配空列表,而hd::tl匹配任何具有至少一个元素的列表,hd并将列表的第一个元素分配给,列表的其余部分(可以为空)分配给tl。 请注意,这hd::tl是一种非常通

  • 我只需要在所有嵌套目录(包括 PWD)下匹配具有一个特定扩展名的文件,并使用“通配”的 BASH。 我不需要将所有嵌套目录下的所有文件与 shell 通配匹配,但不需要在 PWD 中匹配。 我需要使用 grep 以外的命令匹配文件,搜索所有文件扩展名的目录 我不需要只递归地 grep,而只需要在具有某些扩展名(复数)的文件中 适用于所有文件(不是我的问题)。 在 PWD 中不匹配。 返回重复文件。

  • 问题内容: 该字符串可以类似于以下之一: 我想匹配不限数量的“ a(x,y)”。如何使用Regex做到这一点?这是我所拥有的: 它仅匹配“ a(x,y)”的两个递归。 问题答案: Java的标准正则表达式库不支持递归,因此您无法将此类通用嵌套结构与之匹配。 但是在确实支持递归的版本(Perl,PCRE,.NET等)中,您可以使用以下表达式:

  • 字符串可以类似于以下内容之一: 我想匹配无限数量的“a(x,y)”。我如何使用正则表达式来实现这一点?以下是我所拥有的: 它只匹配"a(x, y)"的两个递归。

  • 我有一个这样的字符串: 我需要处理这样上面的代码就变成了 我需要一直这样做直到我 我的模式字符串将匹配整个内容。不是。 Java代码: