求助:用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 }
代码问题分析
- 变量未赋值:你写了
"C:\filelist.txt"但没将其赋值给$textFileWithPaths,导致Get-Content无法读取目标文件。 - 路径拼接错误:直接用
Join-Path $destination $_会把原路径的盘符(如C:\)拼到目标路径里,生成C:\copy_folder\C:\test2这类无效路径。 - 空行未过滤:文本里的空行会被当作有效路径处理,触发错误。
- 特殊字符/空格处理疏漏:原路径中的空格、
$这类特殊字符可能引发识别异常。
修正后的代码
$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
相关产品推荐
相关产品推荐

