В моем тестировании Физический путь
свойство может содержать переменную в формате cmd.exe %системдрайв%
.
Когда это происходит, вы можете выбрать физический путь и извлечь имя переменной среды и оставшийся путь, используя регулярное выражение. Вытащите значение переменной и постройте путь.
$filepath = 'C:\sites.csv'
$sites = получить-веб-сайт
foreach ($ сайт в $ сайтах) {
if($site.physicalPath -match '^%(.+)%(.+)$'){
$sitedir = путь присоединения (Get-Content "env:$($matches.1)") $matches.2
Get-ChildItem -LiteralPath $sitedir
}
}
Если вы подтвердите, что это действительно точный список файлов для каждого сайта, кажется, вы выяснили часть измерения.
Еще пара предложений. Во-первых, я рекомендую Экспорт-CSV
вместо вне файла
.
Далее, вместо того, чтобы открывать файл и добавлять его снова и снова (медленно), вы можете собрать все результаты, а затем записать их.
$results = foreach($site в $sitelist){
... код ...
}
$ результаты | Выходной файл $filepath
Или вы можете использовать ForEach-Object
и воспользоваться конвейером.
$сайтлист | ForEach-Object {
... код ...
} | Выходной файл $filepath
Побочное преимущество ForEach-Object
это -OutVariable
параметр, который позволяет записывать выходные данные в переменную (типа ArrayList
) и просмотреть вывод (или передать его другим командам).
Учитывая мои рекомендации, я бы попробовал.
$filepath = 'C:\sites.csv'
$sites = получить-веб-сайт
$сайты | ForEach-Object {
$ip, $port, $hostHeader = $_.bindings.collection.bindinginformation.split(":")
$path = if($_.physicalPath -match '^%(.+)%(.+)$'){
Путь присоединения (Get-Content "env:$($matches.1)") $matches.2
}
еще{
$_.физический путь
}
$size = (Get-ChildItem $path -Recurse | Measure-Object -Property Length -Sum -ErrorAction Stop).Sum / 1MB
[PSCustomObject]@{
Имя = $_.имя
Полный путь = $путь
IP = $IP
Порт = $порт
Заголовок хоста = $ Заголовок хоста
Размер МБ = $размер
}
} -OutVariable результаты
$ результаты | Export-Csv $filepath-NoTypeInformation