powershell@文件大小排序@文件夹磁盘占用分析@快速分析高性能方案@跨平台方案

abstract

在powershell中完成以下任务的参考方案

  • 统计目录或文件的大小,文件或目录占用大小数值支持单位指定,格式友好
  • 对指定目录以友好的格式列出所有文件和子目录的大小

在linux上有du命令可以完成相关统计任务,以及经过现代化发展的相关命令duf等(支持windows)

扩展介绍其他能够完成此类任务的部分工具,例如everything,详情见相关软件一节

powershell对于列出子目录大小的支持状况

列出子目录大小是一个常见的需求,而 PowerShell 的 ls 命令(或 Get-ChildItem cmdlet)默认没有直接提供这个功能,这可能有几个原因:

  1. 性能考虑:
    计算子目录大小需要递归遍历所有子目录和文件,这对于大型目录结构可能会很耗时。
  2. 设计哲学:
    PowerShell 遵循"做一件事并把它做好"的 Unix 哲学。Get-ChildItem 的主要功能是列出项目,而不是计算大小。
  3. 灵活性:
    PowerShell 提供了构建块(如 Get-ChildItemMeasure-Object),让用户可以根据需求组合这些命令。
  4. 兼容性:
    保持与 CMD 的 dir 命令和 Unix-like 系统的 ls 命令的基本行为一致。

幸运的是,powershell的ls命令提供了-Recurse 参数,可以用来递归列出所有子项目。

虽然这不直接计算子目录大小,但为实现这一功能提供了基础。基于此选项,我们可以列出指定目录下所有文件,然后针对他们的length字段统计或排列满足我们的需要

按文件大小排序指定目录下所有文件

完成这个任务对于powershell来说十分简单

例如,对当前目录执行文件大小排序操作

ls -Path .  -Recurse -File  |sort Length -Descending|select Name,Length, DirectoryName
# [cxxu@CXXUCOLORFUL][<W:192.168.1.178>][C:\repos\c_cpp_consoleapps\cpp\archives]
PS> ls -Path . -Recurse -File  |sort Length -Descending|select Name,Length

Name                                                       Length
----                                                       ------
.DS_Store                                                   15364
.DS_Store                                                    6148
.DS_Store                                                    6148
.DS_Store                                                    6148
binary_tree.cpp                                              5449
18.2.3可变长数组类模板.cpp                                   	4805
longest common word.cpp                                      4289

虽然这完成了排序任务,并且可以灵活指定过滤的属性,但是Length终究不太直观,不显示单位

扩展的专用函数介绍

针对此类文件大小排列相关任务,编写扩展的函数

代码仓库最新版本:PS/Deploy · xuchaoxin1375/scripts - 码云 - 开源中国 (gitee.com)

快速安装相关命令👺

  • 以下命令行尝试为你在线安装相应的powershell工具集合,包众多使用脚本同时体积小巧

    $url = 'https://gitee.com/xuchaoxin1375/scripts/raw/main/PS/Deploy/Deploy-CxxuPsModules.ps1'
    $scripts = Invoke-RestMethod $url
    $scripts | Invoke-Expression
    
    

统计目录或文件的大小@Get-Size👺

  • 以下函数专门为此类任务设计,并且支持指定显示格式,文件大小单位
function Get-Size
{
   
    <#
    .SYNOPSIS
    计算指定文件或目录的大小。

    .DESCRIPTION
    此函数计算指定路径的文件或目录的大小。对于目录,它会递归计算所有子目录和文件的总大小。
    函数支持以不同的单位(如 B、KB、MB、GB、TB)显示结果。

    .PARAMETER Path
    要计算大小的文件或目录的路径。可以是相对路径或绝对路径。

    .PARAMETER Unit
    指定结果显示的单位。可选值为 B(字节)、KB、MB、GB、TB。默认为 MB。

    .EXAMPLE
    Get-Size -Path "C:\Users\Username\Documents"
    计算 Documents 文件夹的大小,并以默认单位(MB)显示结果。

    .EXAMPLE
    Get-Size -Path "C:\large_file.zip" -Unit GB
    计算 large_file.zip 文件的大小,并以 GB 为单位显示结果。

    .EXAMPLE
    "C:\Users\Username\Downloads", "C:\Program Files" | Get-Size -Unit MB
    计算多个路径的大小,并以 MB 为单位显示结果。
    .EXAMPLE
    指定显示单位为KB ,显示5位小数
    PS> Get-Size -SizeAsString -Precision 5 -Unit KB

    Mode  BaseName Size      Unit
    ----  -------- ----      ----
    da--- PS       563.93848 KB
    .EXAMPLE
    保留3位小数(但是显示位数保持默认的2位),使用管道符`|fl`来查看三位小数
    PS> Get-Size -Precision 3 -Unit KB

    Mode  BaseName   Size Unit
    ----  --------   ---- ----
    da--- PS       564.14 KB
    .EXAMPLE
    PS> Get-Size -Precision 3 -Unit KB|fl

    Mode     : da---
    BaseName : PS
    Size     : 564.408
    Unit     : KB
    
    .EXAMPLE
    指定显示精度为4为小数(由于这里恰好第3,4位小数为0,所以没有显示出来,指定更多位数,可以显示)
    PS🌙[BAT:79%][MEM:44.52% (14.12/31.71)GB][0:03:01]
    # [cxxu@CXXUCOLORFUL][<W:192.168.1.178>][C:\repos\scripts\PS]
    PS> Get-Size -SizeAsString -Precision 4

    Mode  BaseName Size Unit
    ----  -------- ---- ----
    da--- PS       0.55 MB

    指定显示精度为5为小数
    PS🌙[BAT:79%][MEM:44.55% (14.13/31.71)GB][0:03:05]
    # [cxxu@CXXUCOLORFUL][<W:192.168.1.178>][C:\repos\scripts\PS]
    PS> Get-Size -SizeAsString -Precision 5

    Mode  BaseName Size    Unit
    ----  -------- ----    ----
    da--- PS       0.55002 MB

    .INPUTS
    System.String[]
    你可以通过管道传入一个或多个字符串路径。

    .OUTPUTS
    PSCustomObject
    返回一个包含路径、大小和单位的自定义对象。

    #>

    [CmdletBinding()]
    param(
        [Parameter( ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [string[]]$Path = '.',
        # [switch]$ItemType,
        [Parameter(Mandatory = $false)]
        [ValidateSet('B', 'KB', 'MB', 'GB', 'TB')]
        [string]$Unit = 'MB',

        #文件大小精度
        $Precision = 2,
        [switch]$SizeAsString,
        [switch]$Detail,
        [switch]$FormatTable
    )
    
    begin
    {
   
        if ($VerbosePreference)
        {
   
            # 即使外部不显示传入-Verbose参数,也会显示Verbose信息
            $PSBoundParameters | Format-Table  
            
        }
        $unitMultiplier = @{
   
            'B'  = 1
            'KB' = 1KB
            'MB' = 1MB
            'GB' = 1GB
            'TB' = 1TB
        }
    }

    process
    {
   
        foreach ($item in $Path)
        {
   
            if (Test-Path -Path $item)
            {
   
                $size = 0
                # 利用Get-item 判断$Path是文件还是目录,如果是目录,则调用ls -Recurse找到所有文件(包括子目录),然后利用管道符传递给Measure计算该子目录的大小
                $itemInfo = (Get-Item $item)
                $baseName = $itemInfo.BaseName
                $Mode = $
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cxxu1375

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值