如何使用PowerShell将仅提供文件路径的多个文件复制到新文件夹
PowerShell 批量复制指定路径文件到单一文件夹
以下方案默认你持有的路径列表为每行一个完整文件路径的TXT格式,若为CSV或其他分隔格式可参考后续适配方案调整。
基础运行脚本
# 1. 配置你的路径参数 $pathListFile = "C:\your_path\file_list.txt" # 你的路径列表文件路径 $targetFolder = "D:\collected_files" # 目标存储文件夹路径 # 2. 自动创建目标文件夹(不存在时) if (-not (Test-Path -Path $targetFolder -PathType Container)) { New-Item -ItemType Directory -Path $targetFolder | Out-Null } # 3. 逐行读取路径并执行复制 Get-Content -Path $pathListFile | ForEach-Object { # 跳过空行 $sourcePath = $_.Trim() if ([string]::IsNullOrWhiteSpace($sourcePath)) { return } # 校验源文件存在后再复制 if (Test-Path -Path $sourcePath -PathType Leaf) { Copy-Item -Path $sourcePath -Destination $targetFolder -Force } }
-Force参数表示遇到重名文件时直接覆盖,不需要交互确认
常用场景适配
- 路径列表为CSV格式:假设路径存储在
full_path列中,将读取路径的代码替换为如下内容即可,其余复制逻辑不变:Import-Csv -Path $pathListFile | ForEach-Object { $sourcePath = $_.full_path.Trim() # 后续复制逻辑和基础脚本一致 } - 重名文件自动重命名不覆盖:将
Copy-Item部分替换为如下逻辑,会自动给重名文件加序号后缀:$fileName = [System.IO.Path]::GetFileName($sourcePath) $targetFullPath = Join-Path -Path $targetFolder -ChildPath $fileName $suffix = 1 while (Test-Path -Path $targetFullPath -PathType Leaf) { $nameWithoutExt = [System.IO.Path]::GetFileNameWithoutExtension($sourcePath) $ext = [System.IO.Path]::GetExtension($sourcePath) $fileName = "${nameWithoutExt}_${suffix}${ext}" $targetFullPath = Join-Path -Path $targetFolder -ChildPath $fileName $suffix++ } Copy-Item -Path $sourcePath -Destination $targetFullPath - 百万级文件性能优化:给
Get-Content加上-ReadCount参数批量读取行,减少磁盘IO开销,示例:# 每次读取1000行再处理,可根据实际情况调整数值 Get-Content -Path $pathListFile -ReadCount 1000 | ForEach-Object { $_ | ForEach-Object { # 原有复制逻辑 } }
注意事项
- 运行前建议先抽取10-20条路径做测试,确认路径解析、复制逻辑符合预期
- 网络驱动器路径优先使用UNC格式(如
\\file_server\share\test.docx),避免映射盘符挂载异常、权限不足的问题 - 可自行添加错误日志记录,方便后续排查不存在、无权限访问的文件,示例:在源文件不存在的分支添加
Add-Content -Path "copy_fail.log" -Value "未找到文件:$sourcePath"
内容的提问来源于stack exchange,提问作者Jason312
相关产品推荐
相关产品推荐

