PowerShell实现多文件夹旧文件归档至子目录Archive,需添加目标变量
嘿,刚上手PowerShell完全不用慌!我帮你整理了一个通用、易维护的脚本,完美匹配你的需求——把C:\source下各个子文件夹里的旧文件,精准移动到对应子文件夹自己的Archive目录里。
优化后的PowerShell脚本
# 定义脚本参数,方便灵活调整(不用改脚本内部就能改规则) param( [string]$SourceRoot = "C:\source", [int]$RetentionDays = 30 # 保留最近N天的文件,超过的自动归档 ) # 获取源根目录下的所有子文件夹(自动排除Archive目录,避免重复处理已归档文件) $subFolders = Get-ChildItem -Path $SourceRoot -Directory | Where-Object { $_.Name -ne "Archive" } foreach ($folder in $subFolders) { # 构建当前子文件夹对应的专属Archive路径 $archivePath = Join-Path -Path $folder.FullName -ChildPath "Archive" # 兜底检查:如果Archive目录意外不存在,自动创建(避免报错) if (-not (Test-Path -Path $archivePath)) { New-Item -Path $archivePath -ItemType Directory | Out-Null } # 计算文件归档的截止日期:当前日期往前推指定天数 $cutoffDate = (Get-Date).AddDays(-$RetentionDays) # 筛选当前子文件夹中,修改时间早于截止日期的所有文件(如需包含子目录文件,加 -Recurse 参数) $oldFiles = Get-ChildItem -Path $folder.FullName -File | Where-Object { $_.LastWriteTime -lt $cutoffDate } if ($oldFiles.Count -gt 0) { Write-Host "正在移动 $($oldFiles.Count) 个旧文件到 $archivePath..." # 移动文件,-Force 参数会覆盖Archive中同名文件(如需手动确认,去掉-Force加-Confirm) $oldFiles | Move-Item -Destination $archivePath -Force Write-Host "✅ $($folder.Name) 归档完成!" } else { Write-Host "ℹ️ $($folder.Name) 中没有需要归档的旧文件。" } } Write-Host "🎉 所有文件夹处理完毕!"
脚本关键细节说明
- 参数化设计:开头的
param块让你不用修改脚本内部代码,直接在运行时调整规则。比如想处理D:\ProjectDocs目录、保留最近60天的文件,只需运行:.\Move-OldFiles.ps1 -SourceRoot "D:\ProjectDocs" -RetentionDays 60 - 避免重复归档:自动排除根目录下的Archive文件夹,不会把已经归档的文件再处理一遍
- 健壮性兜底:自动检查对应子文件夹的Archive目录是否存在,避免因目录缺失报错
- 灵活筛选:默认只处理子文件夹下的直接文件,如果需要连同子目录里的文件一起归档,给
Get-ChildItem加上-Recurse参数即可
使用小技巧
- 第一次运行前,建议把
Move-Item换成Copy-Item先做测试,确保筛选出的文件是你想要归档的,避免误操作 - 如果需要保留文件的原始子目录结构(比如源文件夹里有
SubDir1,要把SubDir1整个移到Archive里),可以修改Get-ChildItem的筛选条件为-Directory,或者调整移动逻辑保留相对路径 - 如果你有已有的待优化脚本,可以贴出来,我帮你针对性调整(比如硬编码路径、筛选逻辑有问题这类常见优化点)
内容的提问来源于stack exchange,提问作者A. Mark
相关产品推荐
相关产品推荐

