Trong thử nghiệm của tôi, Đường dẫn vật lý
thuộc tính có thể chứa biến định dạng cmd.exe %SystemDrive%
.
Khi điều này xảy ra, bạn có thể sử dụng đường dẫn vật lý và trích xuất tên biến môi trường và đường dẫn còn lại bằng biểu thức chính quy. Kéo ra giá trị của biến và xây dựng đường dẫn.
$filepath = 'C:\sites.csv'
$sites = lấy trang web
foreach($site trong $sites) {
if($site.physicalPath -match '^%(.+)%(.+)$'){
$sitedir = Đường dẫn tham gia (Lấy nội dung "env:$($matches.1)") $matches.2
Get-ChildItem -LiteralPath $sitedir
}
}
Nếu bạn xác nhận điều này liệt kê chính xác các tệp cho từng trang web, thì có vẻ như bạn đã tìm ra phần đo lường.
Một vài gợi ý khác. Đầu tiên, tôi khuyên bạn nên Xuất-Csv
thay vì Out-File
.
Tiếp theo, thay vì mở tệp và nối thêm nhiều lần (chậm), bạn có thể thu thập tất cả các kết quả rồi viết chúng.
$results = foreach($site in $sitelist){
... mã số ...
}
$kết quả | Out-File $filepath
Hoặc bạn có thể sử dụng ForEach-Object
và tận dụng lợi thế của đường ống.
$sitelist | ForEach-Object {
... mã số ...
} | Out-File $filepath
Một lợi ích phụ của ForEach-Object
là -OutBiến
tham số cho phép bạn nắm bắt đầu ra trong một biến (đó là loại Lập danh sách
) và xem đầu ra (hoặc chuyển nó sang nhiều lệnh hơn.)
Xem xét các đề xuất của tôi, tôi sẽ thử.
$filepath = 'C:\sites.csv'
$sites = lấy trang web
$trang web | ForEach-Object {
$ip, $port, $hostHeader = $_.bindings.collection.bindinginformation.split(":")
$path = if($_.physicalPath -match '^%(.+)%(.+)$'){
Đường dẫn tham gia (Lấy nội dung "env:$($matches.1)") $matches.2
}
khác{
$_.đường dẫn vật lý
}
$size = (Get-ChildItem $path -Recurse | Measure-Object -Property Length -Sum -ErrorAction Stop).Sum / 1MB
[PSCustomObject]@{
Tên = $_.tên
Đường dẫn đầy đủ = $path
IP = $ip
Cổng = cổng $
HostHeader = $hostHeader
Kích thướcMB = $size
}
} -OutVariable kết quả
$kết quả | Xuất-Csv $filepath -NoTypeInformation