求修正PowerShell脚本:按子文件夹修改时间排序Windows网络共享文件夹
修正你的PowerShell脚本问题
我懂你遇到的糟心事——文件资源管理器只认父文件夹的修改时间,完全不管子文件夹的变化,手动筛选上千个文件夹根本不现实。你的脚本问题出在内层的Get-ChildItem没指定目标路径,导致每次循环都在当前工作目录(而非你遍历的那个父文件夹)递归查找,反复输出同一个最新文件夹也就不奇怪了。
下面是修正后的脚本,我会一步步说清改动点:
Get-ChildItem "C:\temp" -Directory | ForEach-Object { # 针对当前遍历的父文件夹,递归查找所有子文件夹(包括父文件夹本身) $allFolders = Get-ChildItem -Path $_.FullName -Directory -Recurse -Force # 按最后写入时间降序排序,取最新的那个文件夹 $latestFolder = $allFolders | Sort-Object -Property LastWriteTime -Descending | Select-Object -First 1 # 输出结构化结果,方便查看每个父文件夹对应的最新修改项 [PSCustomObject]@{ 父文件夹路径 = $_.FullName 最新修改文件夹 = $latestFolder.FullName 最后修改时间 = $latestFolder.LastWriteTime } }
关键改动说明:
- 指定内层查找路径:用
-Path $_.FullName告诉Get-ChildItem,要在当前循环到的父文件夹($_代表的对象)下递归查找,而非默认的工作目录。 - 包含父文件夹本身:脚本默认把父文件夹的修改时间也纳入考量(
-Recurse会包含当前路径),如果只想看子文件夹,可以在$allFolders后加| Where-Object { $_.FullName -ne $_.Parent.FullName }过滤掉父文件夹。 - 结构化输出:用
PSCustomObject把结果整理成表格形式,比零散的属性输出好读太多。 -Force参数:可选,用来包含隐藏文件夹,不需要的话直接删掉就行。
额外实用扩展:筛选多年未修改的文件夹
既然你的最终目标是删除多年未更新的文件夹,这里给你加个筛选逻辑——比如找出所有父文件夹中,其最新修改的文件夹(含子文件夹)超过3年未更新的:
# 设置截止日期:当前日期往前推3年 $cutoffDate = (Get-Date).AddYears(-3) Get-ChildItem "C:\temp" -Directory | ForEach-Object { $allFolders = Get-ChildItem -Path $_.FullName -Directory -Recurse -Force $latestFolder = $allFolders | Sort-Object LastWriteTime -Descending | Select-Object -First 1 # 检查最新修改时间是否早于截止日期 if ($latestFolder.LastWriteTime -lt $cutoffDate) { [PSCustomObject]@{ 父文件夹路径 = $_.FullName 最新修改文件夹 = $latestFolder.FullName 最后修改时间 = $latestFolder.LastWriteTime 处理建议 = "可考虑删除" } } }
注意事项:
- 访问网络共享时,确保你有足够的读取权限,否则会出现权限错误。可以添加
-ErrorAction SilentlyContinue跳过无权限的文件夹,或者-ErrorAction Stop终止脚本并报错。 - 如果是网络共享路径(比如
\\server\share),直接把"C:\temp"替换成共享路径即可。
内容的提问来源于stack exchange,提问作者NamelessOne




