喜欢听青蛙和鸣 發表於 2025-8-12 16:24:58

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 引言</a></li><li><a href="#_label1">2. PowerShell 基础:Get-ChildItem和文件统计</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">2.1Get-ChildItem基本用法</a></li><li><a href="#_lab2_1_1">2.2 计算文件夹大小</a></li></ul><li><a href="#_label2">3. 隐藏文件的处理</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_2">3.1 什么是隐藏文件和系统文件</a></li><li><a href="#_lab2_2_3">3.2-Force参数的作用</a></li></ul><li><a href="#_label3">4. 优化脚本:递归计算并包含隐藏文件</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_4">4.1 原始脚本分析</a></li><li><a href="#_lab2_3_5">4.2 改进后的脚本(支持隐藏文件)</a></li></ul><li><a href="#_label4">5. 脚本执行优化与注意事项</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_6">5.1 提高执行效率</a></li><li><a href="#_lab2_4_7">5.2 处理权限问题</a></li></ul><li><a href="#_label5">6. 完整代码示例</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">7. 总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1. 引言</h2>
<p>在日常系统管理和文件整理工作中,我们经常需要统计某个目录(及其子目录)的占用空间。PowerShell 提供了强大的文件遍历和计算能力,但默认情况下,它不会处理隐藏文件或系统文件。本文将详细介绍如何使用 PowerShell 递归计算文件夹大小,并确保包含隐藏文件。</p>
<p class="maodian"><a name="_label1"></a></p><h2>2. PowerShell 基础:Get-ChildItem和文件统计</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>2.1Get-ChildItem基本用法</h3>
<p><code>Get-ChildItem</code>(别名 <code>dir</code> 或 <code>ls</code>)是 PowerShell 中用于列出文件和目录的核心命令。基本语法:</p>
<div class="jb51code"><pre class="brush:bash;">Get-ChildItem -Path "C:\TargetFolder"
</pre></div>
<ul><li><code>-Path</code>:指定目标路径(默认当前目录)</li><li><code>-Directory</code>:仅返回目录</li><li><code>-File</code>:仅返回文件</li><li><code>-Recurse</code>:递归遍历子目录</li></ul>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2.2 计算文件夹大小</h3>
<p>要计算文件夹大小,我们需要:</p>
<ul><li>遍历所有文件</li><li>累加文件大小(<code>Length</code> 属性)</li><li>转换为合适的单位(如 MB、GB)</li></ul>
<p>示例:计算单个文件夹大小</p>
<div class="jb51code"><pre class="brush:bash;">$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"
</pre></div>
<ul><li><code>Measure-Object -Sum</code> 计算总和</li><li><code>/ 1MB</code> 转换为 MB(1MB = 1024 * 1024 字节)</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>3. 隐藏文件的处理</h2>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>3.1 什么是隐藏文件和系统文件</h3>
<ul><li>隐藏文件:在 Windows 中,文件或目录可以设置 <code>Hidden</code> 属性(如 <code>.git</code> 目录)。</li><li>系统文件:通常是操作系统关键文件(如 <code>pagefile.sys</code>)。</li></ul>
<p>默认情况下,<code>Get-ChildItem</code> 不会返回隐藏或系统文件。</p>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>3.2-Force参数的作用</h3>
<p><code>-Force</code> 参数让 <code>Get-ChildItem</code> 返回 所有 文件,包括:</p>
<ul><li>隐藏文件</li><li>系统文件</li><li>只读文件</li></ul>
<p>示例:列出所有文件(含隐藏文件)</p>
<div class="jb51code"><pre class="brush:bash;">Get-ChildItem -Force
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 优化脚本:递归计算并包含隐藏文件</h2>
<p class="maodian"><a name="_lab2_3_4"></a></p><h3>4.1 原始脚本分析</h3>
<p>最初的脚本仅计算非隐藏目录和文件:</p>
<div class="jb51code"><pre class="brush:bash;">Get-ChildItem -Directory | ForEach-Object {
    $size = (Get-ChildItem -Path $_.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum / 1MB
    @{
      Folder = $_.Name
      Size_MB = ::Round($size, 2)
    }
} | Sort-Object Size_MB -Descending
</pre></div>
<p>问题:</p>
<ul><li>不会统计隐藏文件夹(如 <code>AppData</code>)</li><li>不会统计隐藏文件(如 <code>.gitignore</code>)</li></ul>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>4.2 改进后的脚本(支持隐藏文件)</h3>
<p>添加 <code>-Force</code> 参数,确保包含隐藏文件:</p>
<div class="jb51code"><pre class="brush:bash;">Get-ChildItem -Directory -Force | ForEach-Object {
    $size = (Get-ChildItem -Path $_.FullName -Recurse -File -Force | Measure-Object -Property Length -Sum).Sum / 1MB
    @{
      Folder = $_.Name
      Size_MB = ::Round($size, 2)
    }
} | Sort-Object Size_MB -Descending
</pre></div>
<p>改进点:</p>
<ul><li><code>Get-ChildItem -Directory -Force</code>:包含隐藏目录</li><li><code>Get-ChildItem -Recurse -File -Force</code>:递归计算所有文件(含隐藏文件)</li></ul>
<p class="maodian"><a name="_label4"></a></p><h2>5. 脚本执行优化与注意事项</h2>
<p class="maodian"><a name="_lab2_4_6"></a></p><h3>5.1 提高执行效率</h3>
<ul><li>避免重复计算:如果目录层级很深,递归遍历可能较慢,可考虑并行计算(<code>ForEach-Object -Parallel</code>,需 PowerShell 7+)。</li><li>限制递归深度:使用 <code>-Depth</code> 参数(如 <code>-Depth 3</code> 仅遍历 3 层子目录)。</li></ul>
<p class="maodian"><a name="_lab2_4_7"></a></p><h3>5.2 处理权限问题</h3>
<ul><li>管理员权限:某些系统目录(如 <code>C:\Windows</code>)需要管理员权限才能访问。</li><li>错误处理:使用 <code>-ErrorAction SilentlyContinue</code> 忽略无权限访问的目录。</li></ul>
<p>优化后的脚本(带错误处理)</p>
<div class="jb51code"><pre class="brush:bash;">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
    @{
      Folder = $_.Name
      Size_MB = ::Round($size, 2)
    }
} | Sort-Object Size_MB -Descending
</pre></div>
<p class="maodian"><a name="_label5"></a></p><h2>6. 完整代码示例</h2>
<div class="jb51code"><pre class="brush:bash;"># 计算当前目录下所有文件夹大小(含隐藏文件)
$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
    @{
      Folder = $_.Name
      Size_MB = ::Round($size, 2)
    }
} | Sort-Object Size_MB -Descending

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

# 可选:导出到 CSV
$results | Export-Csv -Path "FolderSizes.csv" -NoTypeInformation
</pre></div>
<p class="maodian"><a name="_label6"></a></p><h2>7. 总结</h2>
<ul><li><code>Get-ChildItem -Force</code> 是统计隐藏文件的关键。</li><li>递归计算 适用于文件夹大小统计,但需注意性能问题。</li><li>错误处理 可避免因权限问题导致脚本中断。</li></ul>
<p>通过本文的优化方法,您可以更准确地计算文件夹大小,适用于磁盘清理、日志分析等场景。</p>
<p>进一步优化方向:</p>
<ul><li>使用 <code>Robocopy</code> 进行快速统计(适用于超大型目录)</li><li>采用多线程加速计算(PowerShell 7+)</li></ul>
頁: [1]
查看完整版本: PowerShell脚本进阶统计目录大小并包含隐藏文件