Ваш код уже выглядит неплохо, но ..
Неправильно то, как вы используете -Filter
, а также часть, в которой вы преобразуете $_.Path
в UNC-путь.
Кроме того, нам не нужен объект Com (Scripting.FileSystemObject
) для получения фактического размера доли.
Попробуйте это
function Get-ShareSize {
Param(
[String[]]$ComputerName = $env:computername
)
foreach($Computer in $ComputerName){
Get-WmiObject Win32_Share -ComputerName $Computer | Where-Object { $_.Name -notlike '*$' } | ForEach-Object {
# convert the Path into a UNC pathname
$UncPath = '\\{0}\{1}' -f $Computer, ($_.Path -replace '^([A-Z]):', '$1$')
# get the folder size
try {
$Size = (Get-ChildItem $UncPath -Recurse | Measure-Object -Property Length -Sum -ErrorAction Stop).Sum / 1GB
}
catch {
Write-Warning "Could not get the file size for '$uncPath'"
$Size = 0
}
# output the details
[PSCustomObject]@{
'Name' = $_.Name
'LocalPath' = $_.Path
'UNCPath' = $UncPath
'Description' = $_.Description
'Size' = '{0:N2} GB' -f $Size # format the size to two decimals
}
}
}
}
Get-ShareSize -ComputerName localhost
Надеюсь, что это поможет