使用PowerShell+Robocopy复制SystemData下XML文件并保留目录结构
解决嵌套SystemData文件夹中XML文件的复制问题(保留目录结构)
原脚本问题分析
你尝试的代码存在几个关键问题:
- robocopy语法错误:robocopy的标准用法是
robocopy <源目录> <目标目录> <文件>,不能直接将单个文件路径作为源和目标参数 - 冗余的文件创建操作:
New-Item创建目标文件完全没必要,复制操作会自动生成文件,重点应确保目标目录存在 - 路径拼接风险:用字符串拼接生成目标路径容易出现路径分隔符缺失或重复的问题
修正后的PowerShell脚本(推荐方案)
这个方案用原生PowerShell命令实现,更简洁且易维护:
$sourceDir = 'C:\Users\peter.franca\Desktop\ProcessedProducts' $targetDir = 'C:\Users\peter.franca\Desktop\CopiedFiles\ProcessedProducts' # 初始化日志文件 "Backup Started at $(Get-Date)" | Out-File -FilePath 'C:\SystemDataBackup.Log' -Encoding utf8 # 筛选所有SystemData目录下的XML文件并复制 Get-ChildItem -Path $sourceDir -Filter '*.xml' -Recurse | Where-Object { $_.Directory.Name -eq 'SystemData' } | # 精准匹配父目录为SystemData的文件 ForEach-Object { # 替换源路径前缀生成目标路径 $targetFilePath = $_.FullName.Replace($sourceDir, $targetDir) # 确保目标目录存在 $targetFileDir = Split-Path -Path $targetFilePath -Parent if (-not (Test-Path -Path $targetFileDir)) { New-Item -ItemType Directory -Path $targetFileDir -Force | Out-Null } # 复制文件并保留原属性(创建/修改时间等) Copy-Item -Path $_.FullName -Destination $targetFilePath -Force -CopyMode Preserve } # 追加结束日志 "Backup Finished at $(Get-Date)" | Out-File -FilePath 'C:\SystemDataBackup.Log' -Encoding utf8 -Append
基于robocopy的替代方案
如果你坚持使用robocopy,可以直接定位到每个SystemData目录进行批量复制:
$sourceDir = 'C:\Users\peter.franca\Desktop\ProcessedProducts' $targetDir = 'C:\Users\peter.franca\Desktop\CopiedFiles\ProcessedProducts' "Backup Started at $(Get-Date)" | Out-File -FilePath 'C:\SystemDataBackup.Log' -Encoding utf8 # 遍历所有SystemData目录,用robocopy复制XML文件 Get-ChildItem -Path $sourceDir -Directory -Recurse | Where-Object { $_.Name -eq 'SystemData' } | ForEach-Object { $targetSystemDir = $_.FullName.Replace($sourceDir, $targetDir) # robocopy参数说明:/COPY:DT保留日期时间属性,/E复制子目录,/R:3重试3次,/W:5等待5秒 robocopy $_.FullName $targetSystemDir *.xml /COPY:DT /E /R:3 /W:5 # 记录复制动作到日志 "Copied XML files from $($_.FullName) to $targetSystemDir" | Out-File -FilePath 'C:\SystemDataBackup.Log' -Encoding utf8 -Append } "Backup Finished at $(Get-Date)" | Out-File -FilePath 'C:\SystemDataBackup.Log' -Encoding utf8 -Append
内容的提问来源于stack exchange,提问作者Peter Franca
相关产品推荐
相关产品推荐

