![按顺序显示所有子文件夹的大小(Power Shell)](https://linux22.com/image/1632319/%E6%8C%89%E9%A1%BA%E5%BA%8F%E6%98%BE%E7%A4%BA%E6%89%80%E6%9C%89%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%88Power%20Shell%EF%BC%89.png)
我找到了这段代码……它应该获取目录中所有 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”