如何使用PowerShell脚本从子文件夹复制指定类型文件且不保留目录结构
PowerShell 复制指定格式文件不保留层级结构调整方案
原脚本问题原因
原脚本逻辑为遍历所有子目录后对目录执行带-Recurse参数的Copy-Item操作,该操作默认会保留源文件对应的目录层级,因此会在目标路径生成多余文件夹。
优化后脚本
直接递归检索所有符合要求的.txt文件,再统一复制到目标目录即可,无需保留层级结构:
# 写法1:分步写法便于调试 # 递归检索S:\other下所有后缀为txt的文件 $allTxtFiles = Get-ChildItem -Path "S:\other" -Filter "*.txt" -Recurse -File # 逐个复制到目标目录 foreach ($file in $allTxtFiles) { Copy-Item -Path $file.FullName -Destination "D:\FinishFolder\" } # 写法2:管道简写,逻辑完全一致 Get-ChildItem -Path "S:\other" -Filter "*.txt" -Recurse -File | Copy-Item -Destination "D:\FinishFolder\"
可选参数说明
- 若目标目录存在同名文件需要直接覆盖,可在
Copy-Item命令后添加-Force参数 - 若需要避免同名文件覆盖,可在复制前判断目标路径是否存在该文件,自动重命名后再复制,示例如下:
$targetPath = "D:\FinishFolder\" Get-ChildItem -Path "S:\other" -Filter "*.txt" -Recurse -File | ForEach-Object { $newFileName = $_.Name $index = 1 # 循环判断是否存在重名文件,存在则加序号 while (Test-Path (Join-Path $targetPath $newFileName)) { $newFileName = "{0}_{1}{2}" -f $_.BaseName, $index, $_.Extension $index++ } Copy-Item -Path $_.FullName -Destination (Join-Path $targetPath $newFileName) }
内容的提问来源于stack exchange,提问作者maggieeagle
相关产品推荐
相关产品推荐

