如何非递归地收集文件夹大小及其名称? (电源外壳)

时间:2014-05-22 22:14:39

标签: powershell directory filesystemobject non-recursive

基本上我尝试做的是从网络文件夹中收集用户文件夹大小,然后将其导出到.csv,目录结构如下所示:network:\ Department \ user ... User' S-东西

我现在拥有的脚本会获取部门文件名和用户的文件夹大小,但不会获取用户的名称(部门中的文件夹名称)。至于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 MM.d.yyy.@h.mm.sstt) + ".csv" 
       rename-item -path $placeCSV -newname $file
       $placeCSV = $place + $file
    }

#Exports the CSV file to desired folder

$container | epcsv $placeCSV -NoTypeInformation -NoClobber

但是在CSV文件中,用户和时间戳是错误的。感谢任何/所有帮助

1 个答案:

答案 0 :(得分:1)

这似乎是在努力做到这一点。为什么你不会只是使用Get-ChildItem这样做几乎使这个脚本看起来对我来说有点受虐待,所以我将使用该cmdlet而不是创建一个comobject来实现它。

我有点困惑,为什么你不想减小尺寸,但好吧,我们会走那条路。这将为您提供文件夹大小,以MB为单位。

#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 MM.d.yyy.@h.mm.sstt).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并将其替换为{{1}}你有好的去。