PowerShell批量复制网络文件求助:远程文件批量迁移至本地
批量复制远程文件的PowerShell解决方案
没问题,这个需求用PowerShell就能轻松搞定——既然你已经有了所有远程文件的路径列表,而且权限也到位,那直接基于这个列表批量处理就行。我给你准备了两种方案,你可以根据自己的PowerShell版本和实际需求选:
基础循环复制方案(兼容所有PowerShell版本)
这个方案逻辑简单,容易理解和调试,适合新手或者不需要极致效率的场景:
# 配置路径:替换成你自己的输入文件和本地目标文件夹路径 $inputFilePath = "C:\your\path\file_list.txt" $localDestination = "C:\your\local\target\folder" # 先确保本地目标文件夹存在,不存在就创建 if (-not (Test-Path -Path $localDestination)) { New-Item -ItemType Directory -Path $localDestination | Out-Null } # 读取文件列表,逐个复制 Get-Content -Path $inputFilePath | ForEach-Object { $remoteFile = $_ # 跳过空行,避免无效操作 if ([string]::IsNullOrWhiteSpace($remoteFile)) { return } try { # 复制文件,-Force参数会覆盖本地同名文件,不需要的话可以删掉 Copy-Item -Path $remoteFile -Destination $localDestination -Force -ErrorAction Stop Write-Host "✅ 成功复制: $remoteFile" } catch { Write-Error "❌ 复制失败: $remoteFile - 错误详情: $_" } }
代码说明:
- 先检查并创建本地目标文件夹,避免因为文件夹不存在报错
- 读取输入txt的每一行,跳过空行(防止列表里的无效行影响)
- 用
try/catch捕获复制过程中的错误,比如文件不存在、权限临时异常等,方便排查问题 Write-Host会实时显示复制状态,让你知道进度
并行复制方案(提升效率,适合大量文件)
如果你的文件数量较多(150+虽然不算特别多,但并行能节省不少时间),可以用并行处理的方式同时复制多个文件。这里分两种情况:
适用于PowerShell 7及以上版本
PowerShell 7+自带了ForEach-Object -Parallel参数,用起来很方便:
$inputFilePath = "C:\your\path\file_list.txt" $localDestination = "C:\your\local\target\folder" # 确保目标文件夹存在 if (-not (Test-Path -Path $localDestination)) { New-Item -ItemType Directory -Path $localDestination | Out-Null } # 并行复制,-ThrottleLimit控制同时运行的任务数(建议根据网络性能调整,比如5-15) Get-Content -Path $inputFilePath | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | ForEach-Object -Parallel { $remoteFile = $_ $dest = $using:localDestination try { Copy-Item -Path $remoteFile -Destination $dest -Force -ErrorAction Stop Write-Host "✅ 成功复制: $remoteFile" } catch { Write-Error "❌ 复制失败: $remoteFile - 错误详情: $_" } } -ThrottleLimit 10
适用于PowerShell 5.1版本
如果还在使用Windows默认的PowerShell 5.1,可以用后台作业来实现并行:
$inputFilePath = "C:\your\path\file_list.txt" $localDestination = "C:\your\local\target\folder" if (-not (Test-Path -Path $localDestination)) { New-Item -ItemType Directory -Path $localDestination | Out-Null } # 读取有效文件路径 $files = Get-Content -Path $inputFilePath | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } # 创建后台复制任务 $jobs = $files | ForEach-Object { Start-Job -ScriptBlock { $remoteFile = $args[0] $dest = $args[1] try { Copy-Item -Path $remoteFile -Destination $dest -Force -ErrorAction Stop return "✅ 成功复制: $remoteFile" } catch { return "❌ 复制失败: $remoteFile - 错误详情: $_" } } -ArgumentList $_, $localDestination } # 等待所有任务完成,然后获取结果 Write-Host "等待所有复制任务完成..." Wait-Job -Job $jobs | Receive-Job # 清理后台任务,避免残留 Remove-Job -Job $jobs
一些注意事项
- 请确保输入txt文件里的每个路径都是有效且完整的远程路径(比如
\\remote-server\share\file.txt),不要有多余的空格或换行 - 如果不需要覆盖本地已有的同名文件,删掉代码里的
-Force参数即可 - 并行方案的
-ThrottleLimit不要设得太高,否则可能会占用过多网络带宽或系统资源,导致复制变慢甚至出错 - 可以在复制前添加
Test-Path $remoteFile检查远程文件是否存在,提前过滤无效路径
内容的提问来源于stack exchange,提问作者ActiveMeasures
相关产品推荐
相关产品推荐

