You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell使用带通配符的Copy-Item复制文件异常排查

问题背景

需要实现跨文件夹批量复制匹配前缀的文件:

  • 有一份CSV文件存储待匹配的文件名前缀,示例值为ABCD-EFGH
  • 源文件夹内的文件命名格式为ABCD-EFGH-1.pdf、ABCD-EFGH-2.dxf、ABCD-EFGH-3.dwg,需要将所有匹配对应前缀的文件复制到目标文件夹
  • 现有代码运行无报错,但会复制源文件夹内全部文件;如果移除-Path参数末尾的*通配符,又只会复制文件夹本身,不会复制内部匹配文件,需要定位代码问题。

原有代码如下:

$drawing_list = Import-Csv $importfile

#$drawing | Get-Member -MemberType NoteProperty 

# 遍历CSV中的所有记录
foreach($drawing in $drawing_list)
{
        
    # 将源文件夹中匹配图纸名称前缀的所有项复制到目标路径
    Copy-Item -Path "$($sourceFolderName)*" -Filter "$($drawing.Name)*" -Destination $targetFolderName 
                  
}
问题原因

代码存在两个核心错误:

  1. 路径拼接错误:直接在$sourceFolderName后拼接*没有加路径分隔符,比如源文件夹路径为D:\drawings时,拼接后得到D:\drawings*,会匹配源文件夹同级目录下所有名称以drawings开头的文件、文件夹,而非源文件夹内部的内容,匹配范围完全错误。
  2. 参数逻辑错误:当-Path直接指向文件夹本身(末尾不带通配符)时,Copy-Item默认行为是复制整个文件夹容器,不会遍历内部文件执行过滤,就会出现只复制文件夹、不复制内部匹配内容的问题;同时原代码没有限定复制对象类型,可能误匹配子文件夹。
修正方案

使用Join-Path自动处理路径分隔符,明确匹配源文件夹内部的所有对象,同时增加-File参数限定仅复制文件,避免误操作。
修正后代码:

$drawing_list = Import-Csv $importfile

# 遍历CSV中的所有记录
foreach($drawing in $drawing_list)
{
    # 拼接源文件夹内部所有内容的匹配路径,自动处理路径分隔符
    $sourceMatchPath = Join-Path -Path $sourceFolderName -ChildPath '*'
    # 过滤前缀匹配的文件并复制到目标路径
    Copy-Item -Path $sourceMatchPath -Filter "$($drawing.Name)*" -Destination $targetFolderName -File
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:24:37