2

システム内のすべてのユーザーを通過し、ユーザーが所有するすべてのファイルの合計サイズを見つける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"

}

誰か答えを教えてくれたら嬉しいです...ありがとう

4

2 に答える 2

2

ファイルがたくさんある場合は、次のことを検討してください。

$oSIDs = @{}

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

完了したら、SIDを解決します。SDDL文字列から所有者SIDまたはよく知られているセキュリティプリンシパルIDを解析することで、プロバイダーは「わかりやすい」名前を返すために何度も名前解決を繰り返す必要がなくなります。

于 2013-02-07T14:53:38.863 に答える
0

ここで何を求めているのかわかりません。 "to continue with counting total size which user owns for each user"。は?システム上のすべてのファイルをチェックしますか、それとも現在のようにユーザーフォルダーだけをチェックしますか?

スクリプトを微調整してファイルサイズを出力に含めるだけで、スクリプトは正常に機能します。個人的には、すべてのユーザーがフルネーム(admin、guestなど)を持っているわけではないため、これを保存するためにcsvを使用することを検討します。また、ATM。スクリプトはパブリックフォルダーを複数回カウントしています(ユーザーがプロファイルを持っていないたびに)。たとえば、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:\「プログラムファイル」や「ウィンドウ」などの一部の「ルートフォルダー」を除外しながらドライブをスキャンするように変更した別のソリューション。結果を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 ";"
于 2013-02-07T14:45:45.070 に答える