使用PowerShell Move-Item迁移文件至子目录并保留结构报错求助
问题原因
你的代码报错是因为Move-Item不会自动创建目标路径的父目录,而且Get-ChildItem -Recurse会先遍历深层子项(比如sub目录),此时./new/week2还不存在,无法将sub移动到不存在的父目录下;另外,即使父目录存在,先移动子目录内容后,后续处理父目录时原路径的内容已被移走,也会导致路径找不到的问题。
解决方案
方案1:修正PowerShell代码,按深度倒序处理并提前创建父目录
先处理深层的文件和目录,再处理浅层的,同时提前创建目标路径的父目录:
$source = './' $dest = './new' # 按路径深度从深到浅排序,确保先处理深层内容 Get-ChildItem $source -Recurse | Sort-Object { $_.FullName.Split('\').Count } -Descending | ForEach-Object { $newPath = $_.FullName -replace [regex]::Escape($source), $dest # 创建目标路径的父目录(如果不存在) $parentPath = Split-Path $newPath -Parent if (-not (Test-Path $parentPath)) { New-Item $parentPath -ItemType Directory -Force | Out-Null } Move-Item $_ -Destination $newPath -Force }
方案2:用Robocopy高效处理
Robocopy是Windows自带的目录迁移工具,能自动处理目录结构,命令更简洁:
# 移动所有文件和子目录(移动后源文件被删除,空的源目录会保留) robocopy ./ ./new /E /MOV # 如果需要连空的源目录一起删除,替换为/MOVE参数 # robocopy ./ ./new /E /MOVE
参数说明:
/E:复制所有子目录,包括空目录/MOV:移动文件,完成后删除源文件/MOVE:移动文件和目录,完成后删除源目录
内容的提问来源于stack exchange,提问作者Sienna
相关产品推荐
相关产品推荐

