【问题标题】:Generate a report of entire D: Drive using PowerShell使用 PowerShell 生成整个 D: Drive 的报告
【发布时间】:2020-02-17 02:27:11
【问题描述】:

我是 PowerShell 脚本的新手。对于我的一个学校项目,我需要生成整个 D 驱动器的报告。我需要列出所有按大小排序的文件夹

到目前为止我所做的工作总结: 我已经从这个网站安装了一个 PowerShell 模块 https://www.gngrninja.com/script-ninja/2016/5/24/powershell-calculating-folder-sizes 使用 Install-Module PSFolderSize

安装后,如果我运行命令 Get-FolderSize,我将获得运行路径的 FolderSize。文件夹大小未针对目录中的所有文件夹运行。 我在遍历所有文件夹时遇到困难。

预期输出:

+-------------+--------------+--------------+-----------+-----------------------+-----------+
| FolderName  | Size(Bytes)  |   Size(MB)   | Size(GB)  |       FullPath        | HostName  | 
+-------------+--------------+--------------+-----------+-----------------------+-----------+
| Disney      | 454545448889 | 433488.32024 | 423.32844 | D:\Videos\Disney      | localhost |  
| Universal   |  25454544884 | 24275.34569  | 23.70639  | D:\Videos\Universal   | localhost |  
| Fox Studios |   8803063287 | 8395.25536   | 8.19849   | D:\Videos\Fox Studios | localhost |  
+-------------+--------------+--------------+-----------+-----------------------+-----------+

谁能帮我从哪里开始?

【问题讨论】:

  • 来自help center请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作的总结,以及您遇到的困难的描述正在解决它
  • PoSh 在查看文件系统时可以看到的内容是有限制的。其中最常见的限制是...permission to see somethingtotal path length。 ///// 您需要确定导致问题的特定项目,然后调查该项目以确定问题的原因。

标签: powershell csv scripting


【解决方案1】:

由于速度和长文件名问题,我会使用其他工具(如 TreeSize)来创建这样的报告。 但是,您可以使用以下 powershell 命令解决您的任务,而无需下载其他模块。 对于 D:\ 中的每个子文件夹,您必须接收所需的数据。 您必须通过查找每个文件Get-ChildItem -Path $Folder.FullName -Recurse -Force 来计算每个目录的大小,并总结所有文件的长度。 在这里您可以使用Measure-Object -Property Length -Sum。根据目录大小,此任务将需要一些时间。 如果您遇到长文件名问题,请查看here。 收集并将所有数据添加到输出变量后,使用Select-Object -Property 'FolderName', 'Size(Bytes)', 'Size(MB)', 'Size(GB)', 'FullPath', 'HostName' 对标题顺序进行排序。 命令Sort-Object -Property 'Size(Bytes)', 'FolderName' 将根据文件夹大小和名称对输出进行排序。 要获得漂亮的输出,请使用Format-Table

[System.String]$Path = 'D:\'
[PSCustomObject[]]$Output = @()
foreach ($Folder in (Get-ChildItem -Path $Path -Directory))
{
    [System.Int64]$Size = (Get-ChildItem -Path $Folder.FullName -Recurse -Force | Measure-Object -Property Length -Sum).Sum
    [System.Collections.Hashtable]$Hashtable = @{
        'FolderName' = $Folder.Name
        'Size(Bytes)' = $Size
        'Size(MB)' = $Size / 1MB
        'Size(GB)' = $Size / 1GB
        'FullPath' = $Folder.FullName
        'HostName' = $env:COMPUTERNAME
    }
    $Output += New-Object -TypeName 'PSCustomObject' -Property $Hashtable
}

$Output | `
    Select-Object -Property 'FolderName', 'Size(Bytes)', 'Size(MB)', 'Size(GB)', 'FullPath', 'HostName' | `
    Sort-Object -Property 'Size(Bytes)', 'FolderName' | `
    Format-Table

【讨论】:

  • 感谢您的清晰解释。您的解决方案并没有完全解决我的问题,但它帮助我解决了我的问题。我更新了您的代码以包含隐藏文件夹和所有子文件夹。请参阅下面的答案以获得我的问题的完美答案
【解决方案2】:
[System.String]$Path = 'D:\'
[PSCustomObject[]]$Output = @()

foreach ($Folder in (Get-ChildItem -Recurse $Path | Where-Object { $_.PSIsContainer }))
{
    [System.Int64]$Size = (Get-ChildItem -Path $Folder.FullName -Recurse -Force | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum
    [System.Collections.Hashtable]$Hashtable = @{
        'FolderName' = $Folder.Name
        'Size(Bytes)' = $Size
        'Size(MB)' = [Math]::Round($Size / 1MB ,2)
        'Size(GB)' = [Math]::Round($Size / 1GB,2)
        'FullPath' = $Folder.FullName
        'HostName' = $env:COMPUTERNAME
    }
    $Output += New-Object -TypeName 'PSCustomObject' -Property $Hashtable
}

$Output | `
    Select-Object -Property 'FolderName', 'Size(Bytes)', 'Size(MB)', 'Size(GB)', 'FullPath', 'HostName' | `
    Sort-Object -Property 'Size(Bytes)' , 'FolderName' -Descending | `
    Format-Table

【讨论】:

  • 根据您的 powershell 版本,Where-Object { $_.PSIsContainer } 不是必需的,因为Get-ChildItem 支持-Directory 开关。而且我仍然很困惑为什么您在 foreach 循环中使用-Recurse 参数...我认为您只需要 D:\ 中的“第一”级别的报告。不过,我很高兴我的样品对您有所帮助! :-)
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多