我尝试从 IIS (8.5) 获取包含文件夹大小的站点列表,但无法使其工作。
以下是我目前使用的代码,无需尺寸即可运行
Import-Module webAdministration # Required for Powershell v2 or lower
$filepath = C:\sites.csv
$sites = get-website
foreach($site in $sites) {
$name = $site.name
$bindings = $site.bindings.collection.bindinginformation.split(":")
$ip = $bindings[0]
$port = $bindings[1]
$hostHeader = $bindings[2]
"$name,$hostHeader,$ip,$port" | out-host
"$name,$hostHeader,$ip,$port" | out-file $filePath -Append
}
然后我尝试添加这一行
$size = Get-ChildItem -Directory -Force|ForEach {"{0,-30} {1,-30} {2:N2}MB" -f $_.Name, $_.LastWriteTime, ((Get-ChildItem $_ -Recurse|Measure-Object -Property Length -Sum -ErrorAction Stop).Sum/1MB)}
但那也不起作用。
然后我尝试
$size = Get-ChildItem $name + "\folderName\" | Measure-Object -Property Length -sum
已经很接近了,但我认为我的语法有误,$name + "\folderName\"
因为我得到了一系列错误。我说这很接近,因为它有目录的路径,但它不存在。如果我可以将文件夹名称添加到变量中,目录会存在吗$name
?
我哪里做错了?或者我如何检索每个网站文件夹大小的父级?
答案1
在我的测试中,该PhysicalPath
属性可以包含 cmd.exe 格式的变量%SystemDrive%
。
发生这种情况时,您可以获取物理路径并使用正则表达式提取环境变量名称和剩余路径。提取变量的值并构建路径。
$filepath = 'C:\sites.csv'
$sites = get-website
foreach($site in $sites) {
if($site.physicalPath -match '^%(.+)%(.+)$'){
$sitedir = Join-Path (Get-Content "env:$($matches.1)") $matches.2
Get-ChildItem -LiteralPath $sitedir
}
}
如果您确认这确实准确列出了每个站点的文件,则似乎您已经弄清楚了测量部分。
还有一些其他建议。首先,我建议使用Export-Csv
而不是Out-File
。
接下来,您可以收集所有结果然后写入它们,而不是打开文件并一遍又一遍地添加(很慢)。
$results = foreach($site in $sitelist){
... code ...
}
$results | Out-File $filepath
或者您可以使用ForEach-Object
并利用管道。
$sitelist | ForEach-Object {
... code ...
} | Out-File $filepath
的一个附带好处ForEach-Object
是,该-OutVariable
参数可让您捕获变量中的输出(即类型ArrayList
)并查看输出(或将其通过管道传输到更多命令)。
考虑到我的建议,我会尝试一下。
$filepath = 'C:\sites.csv'
$sites = get-website
$sites | ForEach-Object {
$ip, $port, $hostHeader = $_.bindings.collection.bindinginformation.split(":")
$path = if($_.physicalPath -match '^%(.+)%(.+)$'){
Join-Path (Get-Content "env:$($matches.1)") $matches.2
}
else{
$_.physicalpath
}
$size = (Get-ChildItem $path -Recurse | Measure-Object -Property Length -Sum -ErrorAction Stop).Sum / 1MB
[PSCustomObject]@{
Name = $_.name
FullPath = $path
IP = $ip
Port = $port
HostHeader = $hostHeader
SizeMB = $size
}
} -OutVariable results
$results | Export-Csv $filepath -NoTypeInformation