În testarea mea, Calea fizică
proprietatea poate conține variabilă formatată cmd.exe %SystemDrive%
.
Când se întâmplă acest lucru, puteți lua calea fizică și puteți extrage numele variabilei de mediu și calea rămasă folosind regex. Scoateți valoarea variabilei și construiți calea.
$filepath = 'C:\sites.csv'
$sites = get-site
foreach($site în $sites) {
if($site.physicalPath -match '^%(.+)%(.+)$'){
$sitedir = Join-Path (Get-Content "env:$($matches.1)") $match.2
Get-ChildItem -LiteralPath $sitedir
}
}
Dacă confirmați că aceasta listează cu exactitate fișierele pentru fiecare site, se pare că ați dat seama de porțiunea de măsurare.
Alte câteva sugestii. În primul rând, recomand Export-Csv
în loc de Out-File
.
Apoi, în loc să deschideți fișierul și să adăugați din nou și din nou (lent), puteți colecta toate rezultatele și apoi le puteți scrie.
$rezultate = foreach($site în $sitelist){
... codul ...
}
$rezultate | Out-File $filepath
Sau poți folosi Pentru fiecare-obiect
și profitați de conductă.
$sitelist | Pentru fiecare obiect {
... codul ...
} | Out-File $filepath
Un beneficiu secundar al Pentru fiecare-obiect
este -OutVariable
parametru care vă permite să capturați rezultatul într-o variabilă (adică de tip ArrayList
) și vedeți rezultatul (sau direcționați-l către mai multe comenzi.)
Având în vedere recomandările mele, aș încerca asta.
$filepath = 'C:\sites.csv'
$sites = get-site
$site-uri | Pentru fiecare obiect {
$ip, $port, $hostHeader = $_.bindings.collection.bindinginformation.split(":")
$cale = if($_.physicalPath -match '^%(.+)%(.+)$'){
Join-Path (Get-Content "env:$($match.1)") $match.2
}
altfel{
$_.physicalpath
}
$size = (Get-ChildItem $path -Recurse | Măsură-Obiect -Lungimea proprietății -Suma -ErrorAction Stop).Sum / 1MB
[PSCustomObject]@{
Nume = $_.nume
FullPath = $cale
IP = $ip
Port = $port
HostHeader = $hostHeader
SizeMB = $size
}
} -OutVariable rezultate
$rezultate | Export-Csv $filepath -NoTypeInformation