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

求助:用PowerShell从文本列表复制文件并保留文件夹结构

PowerShell 文件批量复制并保留目录结构问题

需求说明

文本文件中包含多个文件的完整路径,需要复制这些文件到指定目录,同时保留原有的文件夹结构。文本文件内容示例:

C:\test2\sample2.jpg


G:\test3\folder1\sample3.mov


C:\test6\fol der1 \sample77.iso


D:\test3\folder1\fo  $der2\sample5.mkv

尝试的代码(新手实现)

$destination = "C:\copy_folder"
"C:\filelist.txt"

Get-Content $textFileWithPaths | % {
  $NewFolder = Split-Path (Join-Path $destination $_) -Parent | Split-Path -NoQualifier`

  If(!(Test-Path $NewFolder)){
    New-Item -ItemType Directory -Path $NewFolder -Force
}
 Copy-Item $_ $NewFolder -Force
}

代码问题分析

  1. 变量未赋值:你写了"C:\filelist.txt"但没将其赋值给$textFileWithPaths,导致Get-Content无法读取目标文件。
  2. 路径拼接错误:直接用Join-Path $destination $_会把原路径的盘符(如C:\)拼到目标路径里,生成C:\copy_folder\C:\test2这类无效路径。
  3. 空行未过滤:文本里的空行会被当作有效路径处理,触发错误。
  4. 特殊字符/空格处理疏漏:原路径中的空格、$这类特殊字符可能引发识别异常。

修正后的代码

$destination = "C:\copy_folder"
$textFileWithPaths = "C:\filelist.txt"

# 读取路径并过滤空行
Get-Content $textFileWithPaths | Where-Object { $_ -match '\S' } | ForEach-Object {
    # 清理路径前后的空格
    $sourcePath = $_.Trim()
    
    # 提取盘符后的相对目录(如C:\test2\file.jpg → test2)
    $relativeDir = [System.IO.Path]::GetDirectoryName($sourcePath).Substring(3)
    
    # 拼接目标文件夹路径
    $targetFolder = Join-Path -Path $destination -ChildPath $relativeDir
    
    # 创建目标文件夹(不存在则创建)
    if (-not (Test-Path -Path $targetFolder)) {
        New-Item -ItemType Directory -Path $targetFolder -Force | Out-Null
    }
    
    # 复制文件到目标位置
    Copy-Item -Path $sourcePath -Destination $targetFolder -Force
}

代码说明

  • Where-Object { $_ -match '\S' }:过滤空行,避免无效处理。
  • $_.Trim():去除路径首尾空格,适配示例中带空格的路径。
  • [System.IO.Path]::GetDirectoryName($sourcePath).Substring(3):剥离盘符,仅保留相对目录结构,避免路径拼接混乱。
  • Out-Null:隐藏目录创建的输出信息,让控制台更整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:10:19