PowerShell问题:ForEach循环重复执行同一路径未切换至下一路径
问题分析与修复方案
核心问题点
- 未读取CSV配置中的路径:循环遍历
$config时,全程用的是被注释掉的$sourcePath和$destPath变量,根本没用到$item里的配置项,导致每次循环都重复处理同一个路径。 - 错误的终止逻辑:Catch块里的
return会直接终止整个外层循环,只要有一个文件复制失败,后续所有路径都不会处理。 - 日期格式错误:
Get-Date的格式字符串多了一个y,应该是yyyyMMdd_HHmmss(如果需要24小时制就用HH,12小时制用hh)。 - 语法错误:
Rename-Item的路径被拆成两行,PowerShell会识别成两个命令,导致执行失败。 - 无效的输出处理:
Copy-Item后接Format-table完全没必要,不会产生有用输出,反而会引发不必要的格式问题。
修复后的PowerShell脚本
Cls $date = Get-Date -Format "yyyyMMdd_HHmmss" $config = Import-Csv -Path 'E:\Backup\Scripts\Atlassian_Backups.csv' Start-Transcript -Path E:\Backup\Logs\Atlassian_backupMove.log foreach ($item in $config) { # 从CSV配置中读取当前的源路径和目标路径 $sourcePath = $item.SourcePath $destPath = $item.DestPath Write-Host "Moving all files in '$sourcePath' to '$destPath'" $fileList = @(Get-ChildItem -Path $sourcePath -File) if ($fileList.Count -gt 0) { Write-Host "Found $($fileList.Count) files to process" foreach ($file in $fileList) { try { # 执行复制操作,去掉多余的Format-table Copy-Item -Path $file.FullName -Destination $destPath -Verbose -Force -ErrorAction Stop } catch { # 输出错误后跳过当前文件,继续处理下一个 Write-Warning "Unable to copy '$($file.FullName)' to '$destPath': $_" continue } } } else { Write-Host "No files found in '$sourcePath'" } } Stop-Transcript # 修复Rename-Item的换行问题 Rename-Item -Path E:\Backup\Logs\Atlassian_backupMove.log -Destination E:\Backup\Logs\Atlassian_backupMove_$date.log Write-Host "Log File has been created and renamed to Atlassian_backupMove_$date.log"
额外说明
- 确保你的
Atlassian_Backups.csv文件包含SourcePath和DestPath两列,每行对应一组源路径和目标路径,比如:SourcePath,DestPath C:\Path1, E:\backups\folder1\export C:\Path2, E:\Backups\folder2\backups C:\Path3, E:\backups\folder3\export - 如果需要用
Move-Item替代Copy-Item,直接把脚本里的Copy-Item改成Move-Item即可,注意目标路径的正确性。
内容的提问来源于stack exchange,提问作者ontljoshi
相关产品推荐
相关产品推荐

