You need to enable JavaScript to run this app. PowerShell按双名称匹配规则筛选子文件夹、复制并保留完整目录结构的实现
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell按双名称匹配规则筛选子文件夹、复制并保留完整目录结构的实现

需求说明

需要实现的核心能力:复制源路径下的完整文件夹嵌套结构,复制过程仅筛选名称包含"Touch"或"mpr"字符串的(子)文件夹,将符合规则的文件夹(含其内部所有文件、嵌套子目录)按原有层级复制到目标路径,不符合命名规则的文件、文件夹不纳入复制范围。

已尝试方案的问题复盘
  • 第一组尝试代码:
    $includes = "*Touch*", "*mpr*"
    Get-ChildItem "C:\Users\Desktop\mro" -Directory |
        Where-Object{$_.Name -in $includes} |
        Copy-Item -Destination "C:\Users\shizzle\Desktop\shi_data6" -Recurse -Force
    
    存在问题:
    1. 匹配逻辑失效:-in操作符仅支持精确值相等比对,无法识别数组元素中的通配符*,筛选条件几乎不生效
    2. 遍历范围不全:未添加-Recurse参数,仅能获取源路径第一层的目录,无法递归匹配所有深层级的子文件夹
    3. 最终效果完全偏离预期:实际复制了全量目录结构,没有实现按名称筛选的要求
  • 第二组尝试代码:
    Get-ChildItem -Path 'C:\Users\Desktop\mro' | Copy-Item -Destination 'C:\Users\Desktop\shi_data9' -Recurse -Container -Filter "*Touch*"
    
    存在问题:
    1. 多规则不生效:-Filter参数是直接传递给底层文件系统接口的单规则筛选器,不支持布尔或的多条件组合,重复设置-Filter参数时仅最后一个配置会生效
    2. 文件遗漏:-Filter仅对当前遍历层级的对象生效,递归复制时会遗漏目标文件夹内部所有名称不包含"Touch"的文件,也无法识别深层目录中符合规则的"mpr"相关文件夹
    3. 完全无法实现“匹配Touch或mpr字符串”的组合筛选逻辑
可落地的正确实现

核心实现逻辑:

  1. 递归遍历源路径下所有层级的文件夹,将筛选逻辑放到PowerShell层面的Where-Object中,通过-like操作符实现多通配符的布尔或匹配,绕开底层-Filter不支持复杂逻辑的限制
  2. 复制前计算每个匹配文件夹相对于源根目录的相对路径,保证复制后的目录层级和源路径完全一致,避免平铺混乱
  3. 对筛选到的目标文件夹执行全量内容复制,避免出现文件夹内部文件遗漏的问题

参考实现代码:

# 配置路径与匹配规则
$sourceRoot = "C:\Users\Desktop\mro"
$destRoot = "C:\Users\Desktop\shi_data_target"
# 匹配规则:只要文件夹名称包含目标字符串即可,覆盖前后任意字符的场景
$matchPatterns = @("*Touch*", "*mpr*")

# 递归获取所有层级文件夹,筛选符合规则的项
$matchedFolders = Get-ChildItem -Path $sourceRoot -Directory -Recurse | 
    Where-Object {
        $currentName = $_.Name
        # 只要文件夹名匹配任意一个通配符规则,即判定为符合要求
        ($matchPatterns | Where-Object { $currentName -like $_ }).Count -gt 0
    }

# 按原有相对层级执行复制
foreach ($folder in $matchedFolders) {
    # 计算当前文件夹相对于源根目录的相对路径
    $relativePath = $folder.FullName.Substring($sourceRoot.Length).TrimStart('\')
    $targetFullPath = Join-Path -Path $destRoot -ChildPath $relativePath
    # 直接复制匹配到的文件夹全部内容,不额外筛选内部文件
    Copy-Item -Path $folder.FullName -Destination $targetFullPath -Recurse -Force
}

代码执行效果:

  • 从源路径最深层目录向上匹配,所有名称带"Touch"或"mpr"的文件夹,都会按和源路径完全一致的嵌套结构复制到目标路径
  • 仅复制筛选到的文件夹本身的全部内容,不会复制源路径下零散文件、名称不匹配的其他文件夹
  • 无文件遗漏、无多余全量拷贝、无多规则失效的问题

内容的提问来源于stack exchange,提问作者shizzle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 09:15:05