获取每个用户 .pst 文件的大小

Get Size of every users .pst Files

大家好,我必须获取目录中每个用户 .pst 文件的大小。我的问题是,我真的不知道如何制作 Foreach 来汇总用户目录中的所有 .pst 文件。别笑我知道foreach循环是完全错误的xD

$arr = Get-ChildItem \Server\users\z01 | Where-Object {$_.PSIsContainer} | Foreach-Object {$_.Name} #Gets names of all Folders in this Directory

$Pfad = \Server\users\z01\

foreach ($arr in $Pfad){
$Sum = Get-ChildItem -Path .\ -Include *pst | measure Length -sum
}
 $Sum

我建议首先获取一个对象数组,其中保留了 pst 文件的全名及其长度。这样您还可以将此信息导出到 CSV 文件以供进一步分析。

然后使用该数组计算总大小:

$Pfad = '\Server\users\z01'
# leave out -Recurse if you do NOT want to include files in subdirectories
$allPstFiles = Get-ChildItem -LiteralPath $Pfad -Filter '*.pst' -File -Recurse | Select-Object FullName, Length
# you can output this on screen or write it to disk as Csv file, see 
# https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-csv

# next get the sum of all sizes
$totalSize = ($allPstFiles | Measure-Object -Property Length -Sum).Sum

$totalSize 

根据您的最新评论,我了解到您想要每个用户的所有 *.pst 文件的总和
(==>文件夹名称$Verzeichniss),GB格式,小数点后两位。

在那种情况下,尝试:

$Verzeichniss = '\Server\users\z01'
$userFolders  = Get-ChildItem -LiteralPath $Verzeichniss -Directory

$Gesamt = foreach ($dir in $userFolders) {
    # take the username from the folder name
    $userName = $dir.Name
    # find all *.pst files for this user
    Get-ChildItem -LiteralPath $dir.FullName -Filter '*.pst' -File -Recurse | 
    # group them by a common property, in this case they all have .pst extension
    Group-Object {$_.Extension} | 
    Select-Object @{Name = 'Name'; Expression = { $userName }},
                  @{Name = 'TotalSizeInGB'; Expression = { '{0:F2}' -f (($_.Group | Measure-Object Length -Sum).Sum / 1Gb ) }}
} 

$Gesamt | Sort-Object -Property TotalSizeInGB -Descending | Select-Object -First 30

因此,为了展示我的最终代码是什么,我将 post 放在这里。我希望你不介意评论是德语的 ;) 我认为代码会说明一切。

#Dieses Script Sucht nach dem geforderten Filetype in dem angegebenen Verzeichniss. Danach wird noch in dem gewünschten Verzeichniss ein CSV File erstellt welches
#alle Order und die summierte Grösse aller Files mit dem angegebenen Filetype anzeigt.

#Variabeln abspeichern

#Hier wird jeweils abgefragt nach welchem File Typ man filtern möchte.
$FileType = Read-Host "Nach welchem File Typ möchtest du suchen?"
#Falls die Eingabe nicht mit einem "." Beginnt wird der Variabel ein Punkt hinzugefügt.
if ($FileType.StartsWith -eq "."){

}else{
        $FileType = ".$($filetype)" 
}

#Für die nächstenbeiden Abfragen wird das gleiche Prinzip wie oben verwendet, einfach mit "\" für die Pfade.
$Verzeichniss = Read-Host "In welchem Verzeichniss möchtest du suchen?"
if ($Verzeichniss.EndsWith -eq "\"){

}else{
        $Verzeichniss += "\"
}

$CSV = Read-Host "Wo möchtest du das CSV File abspeichern?"
if ($CSV.EndsWith -eq "\"){

}else{
        $CSV += "\"
}

#Das Datum wird abgespeichrt um später im CSV Filename einen Timestamp hinzu zu fügen.
$date = Get-Date -format "yyyyMMdd-hh-mm-ss"

#Hier wird ausgelesen mit welchem Zeichen Nummern getrent werden. Wird später gebraucht.
$Separator = [cultureinfo]::CurrentCulture.NumberFormat.NumberDecimalSeparator

#Script

#Hier wird für alle Ordner der Name abgespeichert. Zu dem wird die Grösse aller Files mit dem gewünschtem Filetyp im gleichen Array abgespeichert. Danach werden die Einträge nach der "TotalSizeInGB" Sortiert (Grösste oben). Am schluss werden dann nur noch die ersten 30 Einträge angezeigt.
$Gesamt = Get-ChildItem $Verzeichniss |Select-Object Name,@{Name='TotalSizeInGB';Expression={[math]::Round(((Get-ChildItem -Path $Verzeichniss$($_.Name)\  -Filter *$($FileType) -Recurse -Force | Measure Length -Sum).Sum /1.GB),2)}}  | Sort-Object -Property TotalSizeInGB -Descending | Select-Object -Property Name,TotalSizeInGB -First 30

#Falls der Seperator ein "," ist, werden hier alle "," mit "." ersetzt.
if ($Separator = ","){
    $Gesamt = ($Gesamt | Format-Table -AutoSize | Out-String) -replace ',', '.'
}

#Am Ende wird hier noch das Verzeichniss nach welchem gesucht wird hinzugefügt, um Nachvollziehen zu können von wo die Einräge kommen.
$Gesamt += $Verzeichniss

#Als CSV abspeichern

#Die Variabel wird in einem csv abgespeichert.
$Gesamt | Out-File "$($CSV)temp.csv" -Encoding utf8
#Der Content des CSV wird in einer Variabel abgespeichert.
$import = get-content "$($CSV)temp.csv"
#Es wird eine Linie in der Variabel gescript und dan als CSV an dem gewünschten ort mit dem Timestamp abgespeichert.
$import | Select-Object -Skip 1 | Out-File "$($CSV)list_$($date).csv"
#Das Alte CSV wird gelöscht.
Remove-Item "$($CSV)temp.csv"