Как нерекурсивно собирать размеры папок и их имена? (Пауэршелл)

В основном то, что я пытаюсь сделать, это собрать размер папки пользователей из их сетевой папки, а затем экспортировать ее в .csv, структура каталогов выглядит примерно так: network:\Department\user...User's-stuff

Сценарий, который у меня есть прямо сейчас, получает имя файла отдела и размер папки пользователя, но не имя пользователя (имя папки в отделе). Что касается TimeStamp, я не уверен, что он работает правильно. Он предназначен для создания временной метки, когда он запускается для пользователей в следующем отделе, поэтому в основном все пользователи в одном и том же отделе будут иметь одинаковую временную метку.

Это то, что у меня есть до сих пор:

$root = "network"
$container= @()
$place = "C:\temp\"
$file = "DirectoryReport.csv"

Function Get-FolderSize
{

    BEGIN{$fso = New-Object -comobject Scripting.FileSystemObject}

    PROCESS
        {
        $prevDept = (Split-Path $path -leaf)

        $path = $input.fullname

        $folder = $fso.GetFolder($path)

        $Volume = $prevDept + "-users"

        $user = $folder.name #can't figure this part out...

        $size = $folder."size(MB)"

        if ( (Split-Path $path -leaf) -ne $prevDept)
        {
            $time = Get-Date -format M/d/yyy" "HH:mm #Probably wrong too..
        } 

        return $current = [PSCustomObject]@{'Path' = $path; 'Users' = $user; 'Size(MB)' = ($size /1MB ); 'Volume' = $Volume; 'TimeStamp' = $time;} 

        }

} 

$container += gci $root -Force -Directory -EA 0 | Get-FolderSize

$container

#Creating the .csv path

$placeCSV = $place + $file

#Checks if the file already exists
if ((test-path ($placeCSV)) -eq $true)
    {
       $file = "DirectoryReport" + [string](Get-Date -format [email protected]) + ".csv" 
       rename-item -path $placeCSV -newname $file
       $placeCSV = $place + $file
    }

#Exports the CSV file to desired folder

$container | epcsv $placeCSV -NoTypeInformation -NoClobber

Но в файле CSV пользователь и метка времени неверны. Спасибо за любую / всю помощь


person Gawndy    schedule 22.05.2014    source источник
comment
В общем случае это не должно работать... Атрибут размера для папок, полученных таким образом, заканчивается нулевым значением. Когда вы говорите нерекурсивно, вы не хотите включать содержимое подпапок в свой размер? Вам не нужен общий размер, а только общий размер файлов в корневой папке?   -  person TheMadTechnician    schedule 23.05.2014
comment
Нет, я имею в виду, что я просто не хочу суммировать каждую подпапку внутри папки пользователей. Я надеялся получить размер папки самостоятельно.   -  person Gawndy    schedule 23.05.2014


Ответы (1)


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

Я немного смущен тем, почему вы не хотите использовать рекурсию для размера, но ладно, мы пойдем по этому пути. Это даст вам размеры ваших папок в МБ.

#Get a listing of department folders
$Depts = GCI $root -force -Directory

#Loop through them
ForEach($Dept in $Depts){
    $Users = @()
    $Timestamp = Get-Date -Format "M/d/yyy HH:mm"

    #Loop through each user for the current department
    GCI $Dept -Directory |%{
        $Users += [PSCustomObject]@{
            User=$_.Name
            Path=$_.FullName
            "Size(MB)"=(GCI $_|Measure-Object -Sum Length|Select Sum)/1MB
            Volume="$($Dept.Name)-Users"
            TimeStamp=$Timestamp
        }
    }
}

#Rename output file if it exists
If(Test-Path "C:\Temp\DirectoryReport.csv"){
    Rename-Item "C:\Temp\DirectoryReport.csv" "DirectoryReport.$(Get-Date -format [email protected]).csv"
}

#Output file
$Users | Export-Csv "C:\Temp\DirectoryReport.csv" -NoTypeInformation

Если вы хотите получить общий размер для всех файлов в папке каждого пользователя, включая файлы в подпапках, измените "Size(MB)"=(GCI $_|Measure-Object -Sum Length|Select Sum)/1MB на рекурсивный, заменив его на "Size(MB)"=(GCI $_ -recurse|Measure-Object -Sum Length|Select Sum)/1MB, и это должно вам помочь.

person TheMadTechnician    schedule 22.05.2014
comment
Мой руководитель не хочет делать это рекурсивно. Даже я думаю, что делать это нерекурсивно довольно избыточно. Спасибо за помощь, я попробую и вернусь к вам! - person Gawndy; 23.05.2014