Получить размер подкаталогов и записать в файл PowerShell Windows - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть смонтированный каталог Z: \, и у него есть каталог с именем Main, в нем много подкаталогов, я хочу узнать размер каждой из этих прямых подкаталогов (не под-подкаталогов) и записать их в файл,Так, например, если Main имеет 3 подкаталога A, B, C, тогда я хочу, чтобы текстовый файл выглядел следующим образом

Z:\Main\A 153MB
Z:\Main\B 2.3GB
Z:\Main\C 1.2TB

и так далее.Любой совет, как это можно сделать в powershell?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2019

Я собирался предложить:

$path = 'C:\Program Files'
$Folders = Get-ChildItem -Path $path -Directory -Recurse

foreach ($Folder in $Folders) {

    [PSCustomObject]@{
        Location = $Folder.fullname
        Size = [math]::Round(((Get-ChildItem -Path $Folder.fullname -File | Measure-Object -Property Length -Sum).Sum / 1MB),2)

    }
}

Добавление элементов в массив в цикле не очень хорошая идея, так как массивы статичны.Каждый раз, когда элемент добавляется, массив копируется в память, уничтожается и воссоздается с новым элементом ... это очень дорогой процесс, и его следует избегать, где это возможно !!

0 голосов
/ 19 сентября 2019

это было сделано для друга некоторое время назад ... по умолчанию он получает полный размер дерева подкаталогов.однако параметр переключателя -NoRecurse даст ему только размер каждого вложенного каталога без каких-либо более глубоких изменений.

function Get-SubDirSize
    {
    [CmdletBinding ()]
    Param (
        [Parameter (
            Position = 0
            )]
            [string]
            $Path = $env:TEMP,

        [Parameter ()]
            [switch]
            $NoRecurse
        )

    begin {}

    process
        {
        $DirList = Get-ChildItem -LiteralPath $Path -Directory

        foreach ($DL_Item in $DirList)
            {
            $GCI_Params = @{
                LiteralPath = $DL_Item.FullName
                Recurse = -not $NoRecurse
                File = $True
                Force = $True
                ErrorAction = 'SilentlyContinue'
                }
            $FileList = Get-ChildItem @GCI_Params
            if ($FileList.Count -gt 0)
                {
                $DirSize = [math]::Round(($FileList |
                    Measure-Object -Property Length -Sum).Sum / 1MB, 2)
                }
                else
                {
                $DirSize = 0
                }

            [PSCustomObject]@{
                DirName = $DL_Item.FullName
                FileCount = $FileList.Count
                Size_MB = $DirSize
                }
            }
        }

    end {}

    } # end >>> function Get-SubDirSize

, названный таким образом ...

Get-SubDirSize -Path $env:ProgramData -NoRecurse

... это дает следующее ...

DirName                                 FileCount Size_MB
-------                                 --------- -------
C:\ProgramData\Apple                            0       0
C:\ProgramData\Apple Computer                   0       0
C:\ProgramData\AVAST Software                   0       0
C:\ProgramData\Binary Fortress Software         0       0
C:\ProgramData\chocolatey                       5    6.48
C:\ProgramData\Git                              1       0
C:\ProgramData\IsolatedStorage                  0       0
C:\ProgramData\Last.fm                          0       0
C:\ProgramData\LogiShrd                         1       0
C:\ProgramData\Malwarebytes                     0       0
C:\ProgramData\Microsoft                        0       0
C:\ProgramData\MindGems                         0       0
C:\ProgramData\Mozilla                          0       0
C:\ProgramData\NCH Software                     0       0
C:\ProgramData\Notepad++                        0       0
C:\ProgramData\Oracle                           0       0
C:\ProgramData\Package Cache                    0       0
C:\ProgramData\Samsung                          0       0
C:\ProgramData\shimgen                          0       0
C:\ProgramData\Synology                         0       0
0 голосов
/ 19 сентября 2019

Попробуйте это -

$array= @() 
$folder = "Z:\Main" 
Get-ChildItem $folder -Recurse -Depth 0 | Where-Object { $_.PSIsContainer } | 
ForEach-Object { 
    $obj = New-Object PSObject

    $Size = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1KB, 2) 
    $obj |Add-Member -MemberType NoteProperty -Name "Path" $_.Name 
    $obj |Add-Member -MemberType NoteProperty -Name "SizeMB" $Size 
    $array +=$obj 
}

$array | select Path,SizeMB |  Export-Csv $env:USERPROFILE\Desktop\OutputFile.csv -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...