我不知道你在这里要求什么。
"to continue with counting total size which user owns for each user"
. 嗯?想要检查系统上的每个文件还是只检查当前用户文件夹?
如果您只是调整它以在输出中包含文件大小,您的脚本就可以正常工作。就我个人而言,我会考虑使用 csv 来存储它,因为并非所有用户都会拥有例如全名(管理员、访客等)。还有,自动取款机。您的脚本多次计算公用文件夹(每次用户没有个人资料时)。例如 admin(如果它从未登录过)、guest 等可能都会指定它。
更新了输出文本文件和 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 和@CB 提供的答案的另一种解决方案已修改以扫描您的c:\
驱动器,同时排除一些“根文件夹”,如“程序文件”、“windows”等。它将结果导出到准备用于 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 ";"