按顺序显示所有子文件夹的大小(Power Shell)

按顺序显示所有子文件夹的大小(Power Shell)

我找到了这段代码……它应该获取目录中所有 1 级子文件夹的大小。并在 GUI 中按从大到小的顺序排列它们。它在 power shell 中运行。以前最不复杂的版本可以工作,但它不会按大小重新排序子文件夹。在两种情况下,按升序或降序排序都可以。

来源:http://woshub.com/powershell-get-folder-sizes/#comment-5195

我尝试过的:我尝试了除“C:”之外的其他位置。我不明白这段代码,所以我不知道为什么它不起作用……PS 只是挂在 >> 上,什么也没发生……我以管理员身份运行了 PS!顺便说一句,在 Windows 资源管理器中排序文件夹不起作用,我不喜欢安装许多程序!

$targetfolder='C:\'
$dataColl = @()
gci -force $targetfolder -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$foldername = $_.fullname
$foldersize= '{0:N2}' -f ($len / 1Gb)
$dataObject = New-Object PSObject
Add-Member -inputObject $dataObject -memberType NoteProperty -name “foldername” -value $foldername
Add-Member -inputObject $dataObject -memberType NoteProperty -name “foldersizeGb” -value $foldersize
$dataColl += $dataObject
}
$dataColl | Out-GridView -Title “Size of subdirectories”

答案1

继续我的评论。

从某些网站复制粘贴是不明智的,因为它可能会包含一堆随机字符和在实际代码中无效的标点符号。因此,根本无法运行,或者即使运行也会失败。

例如,那些花哨的引号需要改为简单的引号。简单字符串应该是单引号,而变量扩展(以及一些字符串格式化需要双引号)。Cmdlet 属性名称实际上根本不需要引号,除非它们中有空格。

这也意味着你对 PowerShell 还很陌生(没关系),因此应该花时间熟悉它。Youtube(只需搜索初级 Powershell、中级 PowerShell、高级 PowerShell、PowerShell 文件和文件夹管理等)是你的好朋友,没有理由以管理员身份运行此代码。在大多数情况下,对于日常使用,你永远不需要以管理员身份运行 PowerShell。仅在需要时使用它。

大部分代码都是基本的 PowerShell 内容。然而,它使用了大量别名/简写代码。这就是为什么别名不应该出现在脚本中。此外,在 C 盘上执行此操作将花费非常非常长的时间,具体取决于驱动器的大小和数据量。

它们非常适合交互式/一次性代码,但不适合脚本、函数、模块、cmdlet、共享代码等,否则,就应该避免使用它们。为什么呢?因为许多人从未见过、甚至不知道它们是什么,而且它们不能保证在所有环境和操作系统中都能正常工作,这取决于环境的配置方式。

将所有这些别名更改为其真正的详细名称。您可以使用 Get-Alias cmdlet 查看所有可用别名,然后进行修复,或者一次对每个别名使用 Get-Alias。

Get-Alias 'gci', '?', '%'
# Results
<#
CommandType Name                 Version Source
----------- ----                 ------- ------
Alias       gci -> Get-ChildItem               
Alias       % -> ForEach-Object                
Alias       ? -> Where-Object                  
Alias       h -> Get-History                   
Alias       r -> Invoke-History                
Alias       % -> ForEach-Object  
#>

请参阅帮助文件以了解任何 cmdlet 详细信息和示例。

# Get specifics for a module, cmdlet, or function
(Get-Command -Name Get-Help).Parameters
(Get-Command -Name Get-Help).Parameters.Keys
Get-help -Name Get-Help -Examples
Get-help -Name Get-Help -Full
Get-help -Name Get-Help -Online

所以,这可以帮助您入门。PowerShell 是一种冗长的语言,这是有原因的。易于阅读、理解和故障排除,并且具有自我文档化功能。至于排序,PowerShell 有 Sort-Object cmdlet 可用于此(再次查看帮助文件了解详细信息)。在 Out-GridView 中,就像在 Excel 中一样,只需单击列标题即可按升序或降序排序。

# Set the target folder
$targetfolder = 'C:\'

# Initialize the array
$dataColl = @()

# Get all the files in the $targetfolder, where the type is a directory
Get-ChildItem -Force -Path $targetfolder -ErrorAction SilentlyContinue | 
Where-Object { $PSItem -is [io.directoryinfo] } | 
ForEach {
    # For each directory, collect and calculate the total length/size.
    $len = 0
    Get-ChildItem -Recurse -Force $PSItem.fullname -ErrorAction SilentlyContinue | 
    ForEach { $len += $PSItem.length }

    $foldername = $PSItem.fullname
    
    # Convert length/size to gigabytes format
    $foldersize = '{0:N2}' -f ($len / 1Gb)

    # Create a new custom object for output
    $dataObject = New-Object PSObject

    # Add a now note property hole and output this info
    Add-Member -inputObject $dataObject -memberType NoteProperty -name foldername -value $foldername
    Add-Member -inputObject $dataObject -memberType NoteProperty -name foldersizeGb -value $foldersize

    # add to the collection
    $dataColl += $dataObject
}
# Send the collected data to the OutGridView cmdlet
$dataColl | 
Out-GridView -Title 'Size of subdirectories'

至于这个 [io.directoryinfo],这实际上没有必要,并且 Get-ChildItem 有一个 -File(仅用于文件类型)和 -Directory(仅用于目录类型)。 [io.directoryinfo] 是同一事物的 .Net 命名空间,实际上是遗留的 PowerShell 事物。使用 .Net 命名空间的原因有很多,但除非您使用的是遗留的 PowerShell,否则这不是其中之一。意思是 v3 及更早版本。

始终在投入生产或共享的代码中使用完整详细名称。如果它只是交互式内容或仅供您使用,请使用您选择的任何受支持的简写/别名。

答案2

不确定该代码有什么问题,但它使用了一些过时的构造和不必要的中间变量。这是一个有效的简化版本。

要学习一些东西,请遵循 postanote 的建议别名& Get-Help

代码会递归查询文件夹及其子文件夹中每个文件的大小,因此请先在更有限的文件夹结构上进行测试——c:\可能会超出其能力范围。请注意,Gb 转换和格式化将列出较小的文件夹的0.00大小。我将其更改为1Kb进行测试。

$targetfolder = 'C:\'
gci $targetfolder -Directory -force -ea SilentlyContinue | % {
    $len = 0
    gci $_.fullname -File -recurse -force -ea SilentlyContinue | % { $len += $_.length }

    [PSCustomObject]@{
        FolderName   =  $_.fullname
        FolderSizeGb = '{0:N2}' -f ($len / 1Gb)
    }
} | Out-GridView -Title “Size of subdirectories”

相关内容