You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求修正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
    }
}

关键改动说明:

  1. 指定内层查找路径:用-Path $_.FullName告诉Get-ChildItem,要在当前循环到的父文件夹($_代表的对象)下递归查找,而非默认的工作目录。
  2. 包含父文件夹本身:脚本默认把父文件夹的修改时间也纳入考量(-Recurse会包含当前路径),如果只想看子文件夹,可以在$allFolders后加| Where-Object { $_.FullName -ne $_.Parent.FullName }过滤掉父文件夹。
  3. 结构化输出:用PSCustomObject把结果整理成表格形式,比零散的属性输出好读太多。
  4. -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

火山引擎 最新活动