求修正PowerShell脚本:按类型复制最新备份文件并删除目标旧文件
PowerShell脚本修正:复制最新备份文件并清理旧文件
原脚本存在的问题
- 删除命令路径错误:直接拼接
$Folder会输出DirectoryInfo对象的完整名称而非仅文件夹名;且通配符写法冗余,$fType已包含*.前缀,无需再写*.$fType - Sort-Object参数错误:使用
$_.CreationTime作为排序属性是错误的,应直接指定属性名CreationTime - Copy-Item目标路径错误:Join-Path的用法不符合语法,且未确保目标目录存在,导致复制失败
- 缺少目录存在性检查:删除或复制前未验证目标目录是否存在,会触发异常
修正后的脚本
# 定义源目录和目标目录 $Source = "D:\Fullbackups" $Destination = "X:" # 要处理的文件类型数组 $Filetype = @("*.vbk", "*.vbm", "*.bco") # 遍历源目录下的所有子文件夹 foreach ($Folder in Get-ChildItem $Source -Directory) { # 构建当前文件夹对应的目标路径 $targetFolderPath = Join-Path -Path $Destination -ChildPath $Folder.Name # 确保目标文件夹存在,不存在则创建 if (-not (Test-Path -Path $targetFolderPath)) { New-Item -Path $targetFolderPath -ItemType Directory | Out-Null } # 遍历每种文件类型 foreach ($fType in $Filetype) { # 删除目标目录中当前类型的旧文件 $oldFilesPath = Join-Path -Path $targetFolderPath -ChildPath $fType if (Test-Path -Path $oldFilesPath) { Remove-Item -Path $oldFilesPath -Force } # 获取当前源文件夹下该类型的最新文件 $latestFile = Get-ChildItem -Path $Folder.FullName -Filter $fType -File | Sort-Object -Property CreationTime -Descending | Select-Object -First 1 # 如果找到最新文件,复制到目标目录 if ($latestFile) { Copy-Item -Path $latestFile.FullName -Destination $targetFolderPath -Force } } }
关键修正说明
- 使用
Join-Path构建路径:避免手动拼接字符串导致的路径格式错误 - 新增目标目录检查:用
Test-Path和New-Item确保目录存在,防止操作失败 - 优化文件筛选:
Get-ChildItem直接加-File参数,替代Where-Object { -not $_.PSIsContainer } - 调整排序方式:用
-Descending和Select-Object -First 1更直观获取最新文件,效果和原逻辑一致 - 新增空值检查:确保找到文件后再执行复制,避免无文件时触发错误
- 改用
Remove-Item替代del:PowerShell推荐使用完整命令名,可读性更强
内容的提问来源于stack exchange,提问作者Usermd181
相关产品推荐
相关产品推荐

