
VDI環境などで良くある話ですが、ストレージ容量を小さく設定しているためローカルにはデータを置かないように運用している現場は多いかと思います。
しかし、どれだけ運用で回避しようとしてもユーザーはデータを置いてしまうので、容量が大きくなっているフォルダを探す必要がでてきます。
以下のスクリプトは、BOXDriveを使っている環境で使用しました。
BOXにデータを置くために使っているのですが、BOXのフォルダまで参照することでネットワーク越しのすべてのフォルダの容量を見てしまうと大変時間がかかるのでBOXフォルダ以外を参照するように工夫しております。
# アクセスできない場所はたくさんあるのであらかじめエラーは非表示に設定
$ErrorActionPreference = “silentlycontinue”
# ローカル系のアカウントはあらかじめ除外
$Username = Get-ChildItem C:\Users | ? { $_.PSIsContainer }
$TargetUser = @()
$Username | % {
if($_.name -ne “administrator”)
{
if($_.name -ne “localadmin”) # ここは環境によって削除してください。
{
if($_.name -ne “Public”)
{
$TargetUser += $_.name
}
}
}
}
# BOXドライブの中身を参照すると大変なことになるので、BOX以外のフォルダを抽出
$Folder = @()
$TargetUser | % {
$TargetFolder = $Path = $null
$Path = ‘C:\Users\’ + $_
$TargetFolder = Get-ChildItem $Path -force | ? { $_.PSIsContainer }
$TargetFolder | % {
if($_.name -notlike “*BOX*”)
{
$Folder += $_.fullname
}
}
}
# 再帰的にフォルダの中身を取得して、全フォルダを取得。その後それぞれのフォルダのLength数の合計を取得。合計で1000MB以上あるフォルダをCSVに出力する。
$Folder | % {
$ChildFolder = $MB = $subFolderItems = $null
$ChildFolder = Get-ChildItem $_ -Recurse -force | ? { $_.PSIsContainer }
$ChildFolder | % {
$subFolderItems = (Get-ChildItem $_.Fullname -Recurse -Force | Measure-Object -Property Length -Sum)
$MB = [decimal](“{0:N2}” -f ($subFolderItems.sum / 1MB))
if($MB -ge 1000)
{
$note = $null
$note = $_.Fullname + “`t” + $MB
$note | Out-file $env:UserProfile\Desktop\Excess_Folder.csv -append
}
}
}
この記事へのコメントはありません。