PowerShell脚本进阶统计目录大小并包含隐藏文件

 更新时间:2025年08月12日 16:24:58   作者:码农阿豪@新空间  
在日常系统管理和文件整理工作中,我们经常需要统计某个目录的占用空间,本文将详细介绍如何使用 PowerShell 递归计算文件夹大小,并确保包含隐藏文件,感兴趣的可以了解下

1. 引言

在日常系统管理和文件整理工作中,我们经常需要统计某个目录(及其子目录)的占用空间。PowerShell 提供了强大的文件遍历和计算能力,但默认情况下,它不会处理隐藏文件或系统文件。本文将详细介绍如何使用 PowerShell 递归计算文件夹大小,并确保包含隐藏文件。

2. PowerShell 基础:Get-ChildItem和文件统计

2.1Get-ChildItem基本用法

Get-ChildItem(别名 dirls)是 PowerShell 中用于列出文件和目录的核心命令。基本语法:

Get-ChildItem -Path "C:\TargetFolder"
  • -Path:指定目标路径(默认当前目录)
  • -Directory:仅返回目录
  • -File:仅返回文件
  • -Recurse:递归遍历子目录

2.2 计算文件夹大小

要计算文件夹大小,我们需要:

  • 遍历所有文件
  • 累加文件大小(Length 属性)
  • 转换为合适的单位(如 MB、GB)

示例:计算单个文件夹大小

$folderPath = "C:\Example"
$files = Get-ChildItem -Path $folderPath -Recurse -File
$totalSize = ($files | Measure-Object -Property Length -Sum).Sum / 1MB
Write-Host "Total Size: $($totalSize.ToString('0.00')) MB"
  • Measure-Object -Sum 计算总和
  • / 1MB 转换为 MB(1MB = 1024 * 1024 字节)

3. 隐藏文件的处理

3.1 什么是隐藏文件和系统文件

  • 隐藏文件:在 Windows 中,文件或目录可以设置 Hidden 属性(如 .git 目录)。
  • 系统文件:通常是操作系统关键文件(如 pagefile.sys)。

默认情况下,Get-ChildItem 不会返回隐藏或系统文件。

3.2-Force参数的作用

-Force 参数让 Get-ChildItem 返回 所有 文件,包括:

  • 隐藏文件
  • 系统文件
  • 只读文件

示例:列出所有文件(含隐藏文件)

Get-ChildItem -Force

4. 优化脚本:递归计算并包含隐藏文件

4.1 原始脚本分析

最初的脚本仅计算非隐藏目录和文件:

Get-ChildItem -Directory | ForEach-Object {
    $size = (Get-ChildItem -Path $_.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum / 1MB
    [PSCustomObject]@{
        Folder = $_.Name
        Size_MB = [math]::Round($size, 2)
    }
} | Sort-Object Size_MB -Descending

问题:

  • 不会统计隐藏文件夹(如 AppData
  • 不会统计隐藏文件(如 .gitignore

4.2 改进后的脚本(支持隐藏文件)

添加 -Force 参数,确保包含隐藏文件:

Get-ChildItem -Directory -Force | ForEach-Object {
    $size = (Get-ChildItem -Path $_.FullName -Recurse -File -Force | Measure-Object -Property Length -Sum).Sum / 1MB
    [PSCustomObject]@{
        Folder = $_.Name
        Size_MB = [math]::Round($size, 2)
    }
} | Sort-Object Size_MB -Descending

改进点:

  • Get-ChildItem -Directory -Force:包含隐藏目录
  • Get-ChildItem -Recurse -File -Force:递归计算所有文件(含隐藏文件)

5. 脚本执行优化与注意事项

5.1 提高执行效率

  • 避免重复计算:如果目录层级很深,递归遍历可能较慢,可考虑并行计算(ForEach-Object -Parallel,需 PowerShell 7+)。
  • 限制递归深度:使用 -Depth 参数(如 -Depth 3 仅遍历 3 层子目录)。

5.2 处理权限问题

  • 管理员权限:某些系统目录(如 C:\Windows)需要管理员权限才能访问。
  • 错误处理:使用 -ErrorAction SilentlyContinue 忽略无权限访问的目录。

优化后的脚本(带错误处理)

Get-ChildItem -Directory -Force -ErrorAction SilentlyContinue | ForEach-Object {
    $size = (Get-ChildItem -Path $_.FullName -Recurse -File -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1MB
    [PSCustomObject]@{
        Folder = $_.Name
        Size_MB = [math]::Round($size, 2)
    }
} | Sort-Object Size_MB -Descending

6. 完整代码示例

# 计算当前目录下所有文件夹大小(含隐藏文件)
$results = Get-ChildItem -Directory -Force -ErrorAction SilentlyContinue | ForEach-Object {
    $size = (Get-ChildItem -Path $_.FullName -Recurse -File -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1MB
    [PSCustomObject]@{
        Folder = $_.Name
        Size_MB = [math]::Round($size, 2)
    }
} | Sort-Object Size_MB -Descending

# 输出结果
$results | Format-Table -AutoSize

# 可选:导出到 CSV
$results | Export-Csv -Path "FolderSizes.csv" -NoTypeInformation

7. 总结

  • Get-ChildItem -Force 是统计隐藏文件的关键。
  • 递归计算 适用于文件夹大小统计,但需注意性能问题。
  • 错误处理 可避免因权限问题导致脚本中断。

通过本文的优化方法,您可以更准确地计算文件夹大小,适用于磁盘清理、日志分析等场景。

进一步优化方向:

  • 使用 Robocopy 进行快速统计(适用于超大型目录)
  • 采用多线程加速计算(PowerShell 7+)

到此这篇关于PowerShell脚本进阶统计目录大小并包含隐藏文件的文章就介绍到这了,更多相关PowerShell统计目录大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Windows Powershell 环境变量

    Windows Powershell 环境变量

    Windows PowerShell提供了一个名为euv的盘符,通过它可以访问传统的环境变量。因此,举个例子来说,Cmd.exe传统命令行中的%TEMP%变量,在PowerShell中对应的表达式就是env:\temp。今天我们就来详细的探讨下Powershell的环境变量
    2014-09-09
  • 探索PowerShell(五) PowerShell基础知识

    探索PowerShell(五) PowerShell基础知识

    在PowerShell中,我们可以轻松的与数据、对象进行交互,为了简化我们访问外部数据,PowerShell允许我们像操作驱动器、文件一样对数据、对象等进行操作
    2012-12-12
  • PowerShell面向对象编程基础知识总结

    PowerShell面向对象编程基础知识总结

    这篇文章主要介绍了PowerShell面向对象编程基础知识总结,本文着重讲解面向对象的一些概念,又给出了Get-Member命令输出类的属性和方法的例子,需要的朋友可以参考下
    2014-08-08
  • PowerShell中定义哈希散列(Hash)和调用例子

    PowerShell中定义哈希散列(Hash)和调用例子

    这篇文章主要介绍了PowerShell中定义哈希散列(Hash)和调用例子,本文介绍在PowerShell中如何创建一个哈希变量,并且使用哈希变量,需要的朋友可以参考下
    2014-08-08
  • Powershell 之批量获取文件大小的实现代码

    Powershell 之批量获取文件大小的实现代码

    这篇文章主要介绍了Powershell 之批量获取文件大小的实现代码,需要的朋友可以参考下
    2016-11-11
  • PowerShell隐藏不显示窗口的多种方法

    PowerShell隐藏不显示窗口的多种方法

    这篇文章主要介绍了PowerShell隐藏不显示窗口的多种方法,本文讲解了启动PowerShell时隐藏自己的窗口、在PowerShell启动其它进程时隐藏窗口、使用PowerShell隐藏其它进程的窗口三种方法,需要的朋友可以参考下
    2015-06-06
  • 简单谈谈PowerShell 4.0中的新命令

    简单谈谈PowerShell 4.0中的新命令

    powershell 4.0都出来那么长时间了,相对于powershell 3.0,它的命令都改变了哪些,有哪些更新呢?下面我们就来详细谈谈其中的10个新命令
    2015-09-09
  • PowerShell函数中的开关参数介绍和创建实例

    PowerShell函数中的开关参数介绍和创建实例

    这篇文章主要介绍了PowerShell函数中的开关参数介绍和创建实例,开关参数顾名思义就是起到一个开关作用,需要的朋友可以参考下
    2014-07-07
  • PowerShell脚本实现创建桌面快捷方式的方法

    PowerShell脚本实现创建桌面快捷方式的方法

    这篇文章主要介绍了PowerShell脚本实现创建桌面快捷方式的方法,本文通过调用WScript脚本组件实现,需要的朋友可以参考下
    2014-08-08
  • Powershell小技巧之系统运行时间

    Powershell小技巧之系统运行时间

    本文主要教你如何使用powershell计算系统运行时间,其实很简单,因为Windows每次启动都有一个高进度计数器并且当系统运行这个计数器将返回一个毫秒,我们把这个毫秒计算下就得到系统运行时间了
    2014-09-09

最新评论