Powershell获取用户拥有的文件的总大小

时间:2013-02-07 14:17:50

标签: powershell size

我需要一个powershell脚本,它将遍历系统中的所有用户,并且会找到任何用户拥有的所有文件的总大小...我有脚本通过所有用户,但后来我不知道继续计算用户拥有的每个用户的总大小

这是一个脚本,我现在就是:

$users = Get-WmiObject -class Win32_UserAccount

foreach($user in $users) {
    $name = $user.Name
    $fullName = $user.FullName;
    if(Test-Path "C:\Users\$name") {
        $path = "C:\Users\$name"
    } else {
        $path = "C:\Users\Public"
    }

    $dirSize = (Get-ChildItem $path -recurse | Measure-Object -property length -sum)
 "{0:N2}" -f ($dirSize.sum / 1Gb) + " Gb"
echo "$dirSize"


Add-Content -path "pathototxt..." -value "$name $fullName $path"

}

如果有人知道答案并告诉我,我会非常高兴... 谢谢

2 个答案:

答案 0 :(得分:2)

如果有很多文件,您可能需要考虑:

$oSIDs = @{}

get-childitem <filespec> |
 foreach {
  $oSID = $_.GetAccessControl().Sddl -replace '^o:(.+?).:.+','$1'
  $oSIDs[$oSID] += $_.length
  }

然后在完成后解析SID。从SDDL字符串中解析所有者SID或众所周知的安全主体ID可以使提供者不必重复进行大量重复名称解析,从而为您提供“友好”的名称。

答案 1 :(得分:0)

我不知道你在这里要求什么。 "to continue with counting total size which user owns for each user"。是吧?是否要像现在一样检查系统上的每个文件或仅检查用户文件夹?

如果您只是调整它以在输出中包含filesize,那么您的脚本可以正常工作。就个人而言,我会考虑使用csv来存储它,因为并非所有用户都会使用全名(管理员,客人等)。还有,atm。您的脚本多次计算公用文件夹(每次用户没有配置文件时)。例如。 admin(如果它从未登录过),guest等可能都指定了它。

更新了输出textfile和csv

的脚本
$users = Get-WmiObject -class Win32_UserAccount

$out = @()
#If you want to append to a csv-file, replace the $out line above with the one below
#$out = Import-Csv "file.csv"

foreach($user in $users) {
    $name = $user.Name
    $fullName = $user.FullName;
    if(Test-Path "C:\Users\$name") {
        $path = "C:\Users\$name"
    } else {
        $path = "C:\Users\Public"
    }

    $dirSize = (Get-ChildItem $path -Recurse  -ErrorAction SilentlyContinue | ? { !$_.PSIsContainer } | Measure-Object -Property Length -Sum)
    $size = "{0:N2}" -f ($dirSize.Sum / 1Gb) + " Gb"

    #Saving as textfile
    #Add-Content -path "pathototxt..." -value "$name $fullName $path $size"
    Add-Content -path "file.txt" -value "$name $fullName $path $size"

    #CSV-way
    $o = New-Object psobject -Property @{
    Name = $name
    FullName = $fullName
    Path = $path
    Size = $size
    }

    $out += $o
}

#Exporting to csv format
$out | Export-Csv "file.csv" -NoTypeInformation

编辑:使用@mjolinor和@ C.B提供的答案的另一种解决方案。修改为扫描您的c:\驱动器,同时排除一些“根文件夹”,如“程序文件”,“窗口”等。它将结果导出到准备Excel的csv文件。:

$oSIDs = @{}

$exclude = @("Program Files", "Program Files (x86)", "Windows", "Perflogs"); 

Get-ChildItem C:\ | ? { $exclude -notcontains $_.Name } | % { Get-ChildItem $_.FullName -Recurse -ErrorAction SilentlyContinue | ? { !$_.PSIsContainer } } | % {
  $oSID = $_.GetAccessControl().Sddl -replace '^o:(.+?).:.+','$1'
  $oSIDs[$oSID] += $_.Length
  }

$out = @()
$oSIDs.GetEnumerator() | % { 
    $user = (New-Object System.Security.Principal.SecurityIdentifier($_.Key)).Translate([System.Security.Principal.NTAccount]).Value
    $out += New-Object psobject -Property @{
        User = if($user) { $user } else { $_.Key }
        "Size(GB)" = $oSIDs[$_.Key]/1GB
    }
}

$out | Export-Csv file.csv -NoTypeInformation -Delimiter ";"