PowerShell查找文件夹/文件大小

Posted

技术标签:

【中文标题】PowerShell查找文件夹/文件大小【英文标题】:PowerShell to find folder / file size 【发布时间】:2017-12-22 16:23:39 【问题描述】:

我正在尝试使用 powershell 编写脚本来获取文件夹/文件大小,如下所述

$StartFolder = "D:\"
$Output = "C:\Temp\test-d.csv"

Add-Content -Value "Folder Path|Size" -Path $Output

$colItems = (Get-ChildItem $startFolder -Recurse | Measure-Object -Property Length -Sum)
"$StartFolder -- " + "0:N2" -f ($colItems.Sum / 1MB) + " MB" # | Out-File $Output

$colItems = (Get-ChildItem $startFolder -Recurse | Where-Object $_.PSIsContainer -eq $True | Sort-Object)
foreach ($i in $colItems) 
    $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object -Property Length -Sum)
    $i.FullName + "|" + "0:N2" -f ($subFolderItems.Sum / 1MB) + " MB" | Out-File $Output -Append

我收到如下所述的错误:

测量对象:在任何输入中都找不到属性“长度” 对象。 在行:12 字符:65 + $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ... + + CategoryInfo : InvalidArgument: (:) [Measure-Object], PSArgumentException + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand 测量对象:在任何输入中都找不到属性“长度” 对象。 在行:12 字符:65 + $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ... + + CategoryInfo : InvalidArgument: (:) [Measure-Object], PSArgumentException + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand

另外,当我以 C: 驱动器为目标时,我在某些系统文件上收到“拒绝访问”:

Get-ChildItem:访问路径“C:\Windows\System32\LogFiles\WMI\RtBackup” 被拒绝。 在行:12 字符:28 + $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object - ... + + CategoryInfo : PermissionDenied: (C:\Windows\Syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

【问题讨论】:

如果您不是管理员或没有权限,您将无法像这样修改系统目录。因此,您可以尝试以管理员身份运行或授予必要的权限。由于它没有访问权限,因此无法选择长度。 你到底为什么要用这样的管道连接 table viewl? PowerShell 内置了对 csv、json 的支持,还有一些用于 excel 的模块...... 【参考方案1】:

DirectoryInfo 对象没有Length 属性,因此您需要将大小计算限制为文件。

$colItems = Get-ChildItem $startFolder -Recurse -Force |
            Where-Object  -not $_.PSIsContainer  |
            Measure-Object -Property Length -Sum

使用Scripting.FileSystemObject COM 对象可能更容易,因为这将允许您获取目录对象及其内容的大小。您可能希望使用 Export-Csv 将数据导出到 CSV。使用calculated properties 构建所需的对象。

$fso = New-Object -COM 'Scripting.FileSystemObject'

$folders = @($StartFolder)
$folders += Get-ChildItem $StartFolder -Recurse -Force |
            Where-Object  $_.PSIsContainer  |
            Select-Object -Expand FullName

$folders |
    Select-Object @n='Path';e=$_, @n='Size';e=$fso.GetFolder($_).Size |
    Export-Csv $Output -Delimiter '|' -NoType

【讨论】:

select-object 中有轻微的语法错误。应该是逗号而不是分号分隔两个项目:Select-Object @n='Path';e=$_, @n='Size';e=$fso.GetFolder($_).Size | 确实如此。感谢您的提醒。固定。 @Ansgar Wiechers & Itchydon,感谢您的回复,对于延迟回复我深表歉意。我也在研究获取隐藏文件的大小以及其他文件的大小...有没有办法我们可以做,请告诉我... Get-ChildItem -Force 都试过了 - Get-ChildItem $StartFolder -Recurse -Force & Get-ChildItem -Force $StartFolder -Recurse

以上是关于PowerShell查找文件夹/文件大小的主要内容,如果未能解决你的问题,请参考以下文章

powershell 根据文件中的字节数转换文件大小单位

目录列表中的 powershell 文件大小总计

如何递归获取PowerShell中的所有文件和文件夹的大小,自定义输出

powershell导出文件夹配额

powershell 文件大小和信息

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