PowerShell保留目录最新5个版本脚本运行后文件夹为空问题排查
问题定位
核心原因是复制文件夹时参数配置错误,同时存在多个逻辑隐患:
Copy-Item缺少-Recurse参数:PowerShell 默认复制文件夹仅会创建空的同名目录,不会递归拷贝内部的子文件、子目录,这是你得到空文件夹的直接原因。- 无临时目录存在性校验:如果
D:\temp1目录不存在,复制操作会直接报错,进一步导致后续逻辑异常。 - 冗余代码:你定义的
$limit变量全程未被使用,属于无效代码。 - 风险逻辑:复制操作未做结果校验就直接清空原目录,一旦复制失败会导致所有发行版丢失。
修正后的完整脚本
$path = "D:\ProfileServiceQAT" $Temp = "D:\temp1" # 配置保留的最新发行版数量 $keepCount = 5 # 临时目录不存在时自动创建 if (-not (Test-Path $Temp)) { New-Item -ItemType Directory -Path $Temp | Out-Null } # 获取按创建时间倒序排列的前5个待保留目录 $foldersToKeep = Get-ChildItem -Path $path -Directory | Sort-Object CreationTime -Descending | Select-Object -First $keepCount # 递归复制目录及所有内部内容,Force参数用于覆盖已存在的同名资源 $foldersToKeep | Copy-Item -Destination $Temp -Recurse -Force # 校验复制结果,全部复制成功后再执行后续删除、移动操作 $copySuccess = $true foreach ($folder in $foldersToKeep) { $tempFolderPath = Join-Path $Temp $folder.Name if (-not (Test-Path $tempFolderPath) -or (Get-ChildItem $tempFolderPath | Measure-Object).Count -eq 0) { $copySuccess = $false Write-Error "目录 $($folder.FullName) 复制失败,已终止操作避免数据丢失" break } } if ($copySuccess) { # 清空原目录所有内容 Remove-Item -Path "$path\*" -Recurse -Force # 将保留的目录移回原路径 Move-Item -Path "$Temp\*" -Destination $path -Force # 清空临时目录残留内容 Remove-Item -Path "$Temp\*" -Recurse -Force }
内容的提问来源于stack exchange,提问作者Surya8985
相关产品推荐
相关产品推荐

