Get-DiscUsage C:\ # NOT RECOMMENDED
Get-DiskUsage -Path C:\Users\JBennett\SkyDrive\WindowsPowershell\Scripts\IO\
Size Folder
---- ------
223424B C:\Users\JBennett\SkyDrive\WindowsPowershell\Scripts\IO\DU
どちらの方法でもうまくいきます(あなたが言ったように、最初にスクリプトをドットソーシングした後)。
ただし、私はそれを使用しません... PowerShellで再帰的なディレクトリスキャンを実行し、(数千の)DirectoryInfoオブジェクトを生成してから、各フォルダーで別の再帰的なディレクトリスキャンを実行し、新しいオブジェクトを作成してプロパティを合計します... 恐ろしく遅く、du.exe に比べて大量のメモリと IO を消費します。
少し良い方法
ツリー内のすべてのフォルダーのサイズが再帰的に必要な場合、それを行うアルゴリズム的に正しい方法は、Get-ChildItem の -Recurse フラグを使用しません。あなたは次のようなことをするかもしれません:
function Get-Size {
#.Synopsis
# Calculate the size of a folder on disk
#.Description
# Recursively calculate the size of a folder on disk,
# outputting it's size, and that of all it's children,
# and optionally, all of their children
param(
[string]$root,
# Show the size for each descendant recursively (otherwise, only immediate children)
[switch]$recurse
)
# Get the full canonical FileSystem path:
$root = Convert-Path $root
$size = 0
$files = 0
$folders = 0
$items = Get-ChildItem $root
foreach($item in $items) {
if($item.PSIsContainer) {
# Call myself recursively to calculate subfolder size
# Since we're streaming output as we go,
# we only use the last output of a recursive call
# because that's the summary object
if($recurse) {
Get-Size $item.FullName | Tee-Object -Variable subItems
$subItem = $subItems[-1]
} else {
$subItem = Get-Size $item.FullName | Select -Last 1
}
# The (recursive) size of all subfolders gets added
$size += $subItem.Size
$folders += $subItem.Folders + 1
$files += $subItem.Files
Write-Output $subItem
} else {
$files += 1
$size += $item.Length
}
}
# in PS3, use the CustomObject trick to control the output order
if($PSVersionTable.PSVersion -ge "3.0") {
[PSCustomObject]@{
Folders = $folders
Files = $Files
Size = $size
Name = $root
}
} else {
New-Object PSObject -Property @{
Folders = $folders
Files = $Files
Size = $size
Name = $root
}
}
}
そうすれば、何回もリストすることはありません。マイナス面は、Measure-Object だけを使用することはできないため、自分ですべてを追加する必要があることです。
OPで参照されているスクリプトは、実際にはすべてのアイテムをリストしますが、それは何度も深くなります。つまり、ファイルが C:\Users\Jaykul\Documents\WindowsPowerShell\Scripts にある場合、そのファイルはgci -recurse
親フォルダーごとに表示されます。ルートでスクリプトを呼び出すと、5 回表示されます。
もちろん、すべてのファイルに対して FileInfo を作成し、すべてのディレクトリに対して DirectoryInfo を作成しているだけでなく、スクリプトで手動で作成した要約 PSObject も作成しているため、これがdu.exe とほぼ同じ速さであったとしても、はるかに多くの情報が必要になります。メモリへの影響。
ただし、これは PowerShell 固有のトレードオフです。オブジェクトが重いため、操作が簡単になります。使いやすさとメモリの交換は喜んで行いますが、場合によってはパフォーマンス ヒットさえも犠牲にします。つまり、はい、du.exe の方が高速ですが、これは、誰かが 1 つの目的のために特別に作成しなければならなかったワントリック ポニーです。実行して出力を読み取るだけであれば、これが最善の方法です。しかし、スクリプトで出力を使用したい場合は解析しなければならないテキスト出力が生成され、ダッシュボード スタイルの監視スクリプト全体の出力の一部としてその情報を収集するのは非常に困難です...